Иногда у меня есть сценарий 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;
дает мне ошибку.