Поддерживает ли SQL Server / T-SQL продолжение строки, чтобы разбить длинные строки?

13

Иногда у меня есть сценарий SQL, в котором есть одна или несколько сверхдлинных (иногда даже глупых длинных) строк. Обычно это VARBINARYлитералы / константы, которые представляют файлы / сборки, но иногда они являются текстовыми.

Основная проблема с действительно длинными строками заключается в том, что некоторые текстовые редакторы не справляются с ними слишком хорошо. Например, у меня есть VARBINARYлитерал, который я использую в CREATE ASSEMBLY [AssemblyName] FROM 0x....выражении, а сама сборка имеет размер чуть более 1 МБ, что соответствует чуть более 2 миллионам символов в текстовом файле, поскольку каждый байт требует представления двух символов в шестнадцатеричной записи. (например, 0x1F= a 1и an F). SQL Server Management Studio (SSMS) плохо с этим справляется и зависает на несколько секунд, когда я пытаюсь прокрутить эту строку. И на самом деле, некоторые версии (не уверены, что это все-таки произойдет) даже будут отображать предупреждение о длинных строках при открытии скрипта, который имеет хотя бы одну строку определенной длины.

Вторая проблема заключается в том, что это усложняет форматирование при использовании в редакторе без включения переноса слов или при публикации в Интернете. Проблема здесь в том, что ползунок для горизонтальной полосы прокрутки очень узкий, и его перемещение даже чуть-чуть обычно прокручивает не сверхдлинный текст вне поля зрения.

Теперь T-SQL не завершает команды символами новой строки или даже точкой с запятой (хотя точки с запятой предпочтительны / рекомендуются, начиная с SQL Server 2005). Так как SQL Server знает, как анализировать каждый оператор так, чтобы он знал, когда он заканчивается, кажется, что разделение длинной строки на несколько строк, разделенных только символом newline/ carriage-return+ line-feed, не представляется необоснованным. Но это не работает ни в одном случае.

PRINT 'Line1
Line2';

возвращает (во вкладке «Сообщения»):

Line1
Line2

И это имеет смысл, так как символ новой строки находится в пределах литерала / константы. Но делать это VARBINARYтоже не работает.

PRINT 0x1234
5678;

дает мне ошибку.

Соломон Руцкий
источник

Ответы:

13

К счастью, есть поддержка продолжения строки в T-SQL через \символ (обратный слэш). Просто поместите это в конец строки, прямо перед newline/ carriage-return+ line-feed, и символ новой строки будет проигнорирован.

Для текстовых строк это ведет себя следующим образом:

PRINT 'Line1\
Line2';

возвращает (во вкладке «Сообщения»):

Line1Line2

Для двоичных / шестнадцатеричных строк это ведет себя следующим образом:

PRINT 0x1234\
5678;

возвращает (во вкладке «Сообщения»):

0x12345678;

Чтобы отформатировать двоичные файлы (сборки, сертификаты) в текстовые шестнадцатеричные строки для использования в сценариях SQL, я написал утилиту командной строки под названием BinaryFormatter, которую я выпустил в GitHub с открытым исходным кодом. Он не только преобразует двоичный файл в текстовое представление, но также использует продолжение строки для распределения длинных VARBINARYлитералов по необходимому количеству строк на основе заданного количества символов для использования в каждой строке. В результате получается что-то вроде:

4D5A09DE34F178313345A4\
00007F4E39782EFC48D842\
00000000

который я затем копирую и вставляю в свой скрипт, как показано в {...}области ниже:

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

Дополнительные сведения по этой теме см. В моем блоге: продолжение строки в T-SQL.

Соломон Руцкий
источник