SQL - Ersetzen alle "ASCII/Sonderzeichen" in einen string
Edit: ich habe ungefähr 80 Zeichen, die Probleme verursachen in meiner Anwendung so will ich nicht zu hart code ERSETZEN für jedes einzelne Zeichen. Ich denke, es wäre einfacher zu erstellen Sie eine separate Tabelle mit zwei Spalten,"Sonderzeichen" und "replacement characters", und ich werde entfernen, die Spalten aus der original-Tabelle enthält die Spalte "StringTest". Mein Ziel wird es sein, herauszufinden, wie man die Zeichen-Tabelle zu ersetzen, die Zeichen in der string-Tabelle.
Ich versuche, Sie zu ersetzen alle "Sonderzeichen" (also À, Æ, Ç) mit "MappedCharacters" (A, AE, C) in SQL Server. Ich habe versucht, zwei verschiedene Techniken, einer mit einem cursor, ohne einen cursor zu durchsuchen einer Zeichenkette und ersetzt alle Sonderzeichen mit zugeordneten Zeichen. Jede meiner Methoden ersetzt nur Charaktere, die Sie in der gleichen Zeile als string.
Beispiel vor:
num SpecialCharacter MappedCharacter StringTest
1 À A StringÀÆ
2 Æ AE ÆStringÆ
3 Ç C StrÇÀing
Beispiel nach:
num SpecialCharacter MappedCharacter StringTest
1 À A StringAÆ
2 Æ AE AEStringAE
3 Ç C StrCÀing
Bevorzugte Ausgabe:
num SpecialCharacter MappedCharacter StringTest
1 À A StringAAE
2 Æ AE AEStringAE
3 Ç C StrCAing
Damit Sie sehen können, dass ich alle ersetzen will "Sonderzeichen" in StringTest, sondern nur Zeichen, die in der gleichen Zeile werden immer ersetzt.
Ich habe noch nicht ganz herausgefunden, wie man das nur noch nicht.
Sind hier die zwei SQL-code, ich habe versucht, Sie zu ändern (ich brauche nur eine, um zu arbeiten)
Erste Methode:
DECLARE @cASCIINum INT;
DECLARE @cSpecialChar VARCHAR(50);
DECLARE @cMappedChar VARCHAR(50);
DECLARE @cStringTest VARCHAR(50);
DECLARE @mapCursor as CURSOR;
SET @mapCursor = CURSOR FOR
SELECT [ASCIINum]
,[SpecialChar]
,[MappedChar]
,[StringTest]
FROM [intranet].[dbo].[CharMapTestTab];
OPEN @mapCursor;
FETCH NEXT FROM @mapCursor INTO @cASCIINum,
@cSpecialChar,
@cMappedChar,
@cStringTest;
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE [intranet].[dbo].[CharMapTestTab]
SET StringTest = REPLACE(StringTest, SpecialChar, MappedChar)
WHERE SpecialChar <> MappedChar
END
CLOSE @mapCursor;
DEALLOCATE @mapCursor;
Zweite Methode:
DECLARE @ASCIINum INT = 0
WHILE (1 = 1)
BEGIN
SELECT @ASCIINum = ASCIINum
FROM [intranet].[dbo].[CharMapTestTab]
WHERE ASCIINum > @ASCIINum
ORDER BY ASCIINum
IF @@ROWCOUNT = 0 BREAK;
UPDATE [intranet].[dbo].[CharMapTestTab]
SET StringTest = REPLACE(StringTest, SpecialChar, MappedChar)
WHERE SpecialChar <> MappedChar
SELECT TOP 1000 [ASCIINum]
,[SpecialChar]
,[MappedChar]
,[StringTest]
FROM [intranet].[dbo].[CharMapTestTab]
END
Sie müssen Fetch Next innerhalb der Schleife auch. Wie in Fetch first while @@FetchStatus = 0 etwas zu tun FetchNext Ende
Dies ist in SQL Server-Thit Lwin Oo
Die sind beide Cursor
InformationsquelleAutor BrettKB | 2014-03-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie dieses, es funktioniert besser als die Schleife, da es nur 1 update:
Ergebnis:
Wow - sehr cool! Ich wusste nicht, könnten Sie rekursiv bauen eine Zeichenfolge (string) ERSETZEN, so dass in einer einfachen SELECT. Ich Frage mich, ob es irgendwelche Einschränkungen auf wie viele Befehle ERSETZEN können zusammengestellt werden? BTW, wenn Sie temporäre Tabellen in deinem Beispiel ist es einfacher für Menschen, um den code auszuführen und nicht mess up Ihre dev. Datenbanken mit Tabellen... 😉
InformationsquelleAutor t-clausen.dk
Ich würde einen separaten mapping-Tabelle enthält, die den schlechten Charakter und seine entsprechenden guten Charakter, ein Satz pro Zeile. Dann loop über die Tabelle und machen Sie einen Ersatz für jedes Zeichen festlegen.
InformationsquelleAutor clhereistian
Wäre es hilfreich zu wissen, wie viele Zeilen in Ihrer Tabelle und wie viele Sie schätzen, dass "Sonderzeichen". Auch gibt es nur 3 Sonderzeichen? wenn Sie 40 oder weniger Sonderzeichen, kann es lächerlich Aussehen, aber ich würde das nest so viele REPLACE () - Aufrufe, wie Sie spezielle Zeichen, wie:
wenn die meisten Zeilen haben Sonderzeichen, ich würd überspringen jede
WHERE
. wenn nur ein paar Zeilen Sonderzeichen verwende ich einen CTE, Sie zu identifizieren:auch mit 100, ich würde nur zu codieren, Sie in einer geschachtelten
REPLACE()
. Wenn man sich mal "fix" von dem Tisch, nur um es getan, Sie brauchen nicht etwas Phantasie oder Komplex.InformationsquelleAutor KM.
Verlasse ich den 3. um Sie
Oder diese möglicherweise effizienter
Wenn Sie wirklich wollen, um Prozess eine Liste von Zeichen zugeordnet, dann ist dies nicht eine richtige Antwort
OK das ist ein Beispiel, wie man ohne einen cursor. Und ich mag Sie answwer +1.
InformationsquelleAutor paparazzo
@t-clausen.dk Antwort mit Table-Variablen und temporäre Tabellen, nur um zu vermeiden, Leute versauen Ihre dev-Datenbanken mit zusätzlichen Tabellen.
TABELLE Variablen:
Mit Temp-Tabelle:
InformationsquelleAutor Sathish