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

13

Ich habe manchmal ein SQL-Skript, das eine oder mehrere superlange (manchmal sogar dumm lange) Zeichenfolgen enthält. In der Regel sind dies VARBINARYLiterale / Konstanten, die Dateien / Assemblys 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 VARBINARYLiteral, das ich in einer CREATE ASSEMBLY [AssemblyName] FROM 0x....Anweisung verwende, 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 (zB 0x1F= a 1und an 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 ist, dass es die Formatierung erschwert, wenn es entweder in einem Editor ohne aktivierten Zeilenumbruch verwendet 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 sehr lange 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 nicht unangemessen , die lange Zeile auf mehrere Zeilen aufzuteilen, die nur durch ein newline/ carriage-return+ getrennt sind line-feed. 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 zu tun, VARBINARYfunktioniert auch nicht.

PRINT 0x1234
5678;

gibt mir einen Fehler.

Solomon Rutzky
quelle

Antworten:

13

Zum Glück wird die Zeilenfortsetzung in T-SQL über das \Zeichen (Backslash) unterstützt. Platzieren Sie dies einfach am Ende einer Zeile direkt vor dem newline/ carriage-return+ line-feed, und die neue Zeile 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 Hex-Byte-Textzeichenfolgen 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 VARBINARYLiterale auf so viele Zeilen zu verteilen, wie erforderlich sind, 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 folgenden {...}Bereich gezeigt :

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

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

Solomon Rutzky
quelle