it-swarm.com.de

Unterstützt SQL Server / T-SQL die Zeilenfortsetzung, um lange Zeichenfolgen aufzubrechen?

Ich habe manchmal ein SQL-Skript, das eine oder mehrere superlange (manchmal sogar dumm lange) Zeichenfolgen enthält. In der Regel sind dies VARBINARY Literale/Konstanten, die Dateien/Assemblies darstellen, gelegentlich jedoch auch Text.

Das Hauptproblem bei sehr langen Zeichenfolgen besteht darin, dass einige Texteditoren sie nicht so gut verarbeiten. Zum Beispiel habe ich ein VARBINARY -Literal, das ich in einem CREATE Assembly [AssemblyName] FROM 0x.... Anweisung, und die Assembly selbst ist etwas mehr als 1 MB groß, was etwas mehr als 2 Millionen Zeichen in einer Textdatei entspricht, da für jedes Byte zwei Zeichen in hexadezimaler Schreibweise dargestellt werden müssen (z. B. 0x1F = a 1 und ein F). SQL Server Management Studio (SSMS) verarbeitet dies nicht gut und bleibt einige Sekunden lang hängen, während ich versuche, über diese Zeile zu scrollen. Tatsächlich zeigen einige Versionen (nicht sicher, ob dies immer noch passiert) sogar eine Warnung vor langen Zeilen an, wenn ein Skript geöffnet wird, das mindestens eine Zeile über eine bestimmte Länge enthält.

Ein sekundäres Problem besteht darin, dass die Formatierung erschwert wird, wenn sie entweder in einem Editor ohne aktivierten Word-Wrap oder online veröffentlicht wird. Das Problem hierbei ist, dass der Schieberegler für die horizontale Bildlaufleiste sehr schmal ist und beim Verschieben nur ein wenig verschoben wird, wodurch der nicht superlange Text normalerweise nicht mehr angezeigt wird.

Jetzt beendet T-SQL Befehle nicht mit Zeilenumbrüchen oder Semikolons (obwohl Semikolons ab SQL Server 2005 bevorzugt/empfohlen werden). Da SQL Server weiß, wie jede Anweisung so analysiert wird, dass sie weiß, wann sie endet, scheint es, als würde die lange Zeile auf mehrere Zeilen aufgeteilt, die nur durch a getrennt sind newline /. carriage-return + line-feedscheint nicht unvernünftig. Dies funktioniert jedoch in beiden Fällen nicht.

PRINT 'Line1
Line2';

gibt zurück (auf der Registerkarte "Nachrichten"):

Line1
Line2

Und das macht Sinn genug, da die Newline innerhalb eines Literal/einer Konstante liegt. Aber dies für ein VARBINARY zu tun, funktioniert auch nicht.

PRINT 0x1234
5678;

gibt mir einen Fehler.

13
Solomon Rutzky

Zum Glück gibt es Unterstützung für die Zeilenfortsetzung in T-SQL über die \ (Backslash) Zeichen. Platzieren Sie das einfach am Ende einer Zeile, direkt vor dem newline /. carriage-return + line-feed, und der Zeilenumbruch wird ignoriert.

Bei Textzeichenfolgen verhält sich dies wie folgt:

PRINT 'Line1\
Line2';

gibt zurück (auf der Registerkarte "Nachrichten"):

Line1Line2

Bei Binär-/Hex-Zeichenfolgen verhält sich dies wie folgt:

PRINT 0x1234\
5678;

gibt zurück (auf der Registerkarte "Nachrichten"):

0x12345678;

Um Binärdateien (Assemblies, Zertifikate) in Text-Hex-Byte-Zeichenfolgen zur Verwendung in SQL-Skripten zu formatieren, habe ich ein Befehlszeilenprogramm namens BinaryFormatter geschrieben, das ich als Open Source auf GitHub veröffentlicht habe. Es konvertiert nicht nur Binärdateien in eine Textdarstellung, sondern verwendet auch die Zeilenfortsetzung, um lange VARBINARY - Literale auf so viele Zeilen zu verteilen, wie benötigt werden, basierend auf der angegebenen Anzahl von Zeichen, die pro Zeile verwendet werden sollen. Das Ergebnis ist wie folgt:

4D5A09DE34F178313345A4\
00007F4E39782EFC48D842\
00000000

die ich dann kopiere und in mein Skript einfüge, wie im Bereich {...} unten gezeigt:

CREATE Assembly [AssemblyName]
FROM 0x\
{output from BinaryFormatter}
;

Weitere Details zu diesem Thema finden Sie in meinem Blogbeitrag: Zeilenfortsetzung in T-SQL

13
Solomon Rutzky