Was tut STRING_ESCAPE?
Ihr habt hier nun schon einige Funktionen zur Manipulation von Zeichenketten (Strings) kennengelernt. In diese Reihe passt auch STRING_ESCAPE
. Die STRING_ESCAPE
-Funktion ist eine Funktion, die bei einer Zeichenkette Sonderzeichen ersetzt, damit diese Zeichenkette an anderer Stelle verwendet werden kann. Ein klassisches Beispiel für das Escapen von Zeichenketten ist, dass ihr um SQL Injection-Attacken zu vermeiden, keine Zeichenketten direkt in eure Anwendung übergeben solltet, sondern immer entweder SqlParameter verwenden oder aber zumindest das einfache Hochkomma durch ein doppeltes ersetzen, um Namen wie diesen zu vermeiden:
';DROP TABLE User;
Bei STRING_ESCAPE
geht es aber nicht darum, Zeichenketten für die sichere Verwendung im SQL Server zu Escapen sondern darum, sie zu Escapen wenn sie aus dem SQL Server an eine andere Anwendung übergeben werden sollen.
Wie verwendet ihr STRING_ESCAPE?
Die Anzahl der Austauschformate für Daten ist vermutlich nahezu unendlich. Allerdings hat sich in vielen Bereichen in den letzten Jahren JSON als das Format der Wahl durchgesetzt. Daher ist es nicht überraschend, dass Microsoft als im SQL Server 2016 die STRING_ESCAPE
Funktion eingeführt wurde, zunächst den Export nach JSon im Hinterkopf hatte. Die STRING_ESCAPE
-Funktion bekommt zwei Argumente übergeben: den Text, der escaped werden soll sowie den gewünschten Ausgabetypen, also für welches Zielformat escaped wird. Letzteres unterstützt aber seit der Einführung der Funktion nur den Wert “json”, derzeit könnt ihr mit STRING_ESCAPE
also nur Texte für die Verwendung in einem JSON-Attribut vorbereiten. Sehen wir uns einmal an, wie das funktioniert. Sonderzeichen in JSON sind beispielsweise Anführungszeichen und Schrägstriche. Rufen wir die STRING_ESCAPE
-Funktion also einmal auf:
SELECT STRING_ESCAPE('"', 'json')
Hier bekommen wir das durch den Backslash escapte Anführungszeichen zurückgeliefert. Ähnlich funktioniert das natürlich auch für Slashes (/) und Backslashes ():
SELECT STRING_ESCAPE('/"\', 'json')
Doch auch die ASCII-Steuerzeichen CHAR(0)
bis CHAR(31)
(eine detaillierte Auflistung dieser Zeichen findet ihr beispielsweise hier: https://de.wikipedia.org/wiki/Steuerzeichen) müssen escaped werden.
Eine Liste dieser Zeichen und ihrer “Übersetzungen” könnt ihr euch wie folgt erzeugen:
DROP TABLE IF EXISTS #Characters CREATE TABLE #Characters ( [Char] varchar(20) ,[Escaped] varchar(20) ) DECLARE @CharNo int = 0 WHILE @CharNo < 32 BEGIN INSERT INTO #Characters ([Char], [Escaped]) VALUES ('CHAR('+CAST(@CharNo as varchar(2))+')', STRING_ESCAPE(CHAR(@CharNo), 'json')) SELECT @Charno = @CharNo+1 END SELECT [Char], [Escaped] from #Characters
Hier seht ihr beispielsweise, dass ein CHAR(13)
einem "\r" also einem Return, einer neuen Zeile und ein CHAR(10)
einem "\n", also einem Zeilenumbruch entsprechen.
Nun könntet ihr natürlich wenn ihr beispielsweise Texte aus einem Content Management System für die maschinelle Weiterverarbeitung exportieren möchtet, alle diese Zeichen in einem sehr langen geschachtelten REPLACE
-Statement ersetzen, oder aber ihr verwendet einfach STRING_ESCAPE
und erhaltet den Text aufbereitet für die Weitergabe im JSON-Format.
Der schlaue Ninja kennt die Waffen, die ihm zur Verfügung stehen und weiß sie einzusetzen wenn das angemessen ist.