Чи підтримує SQL Server / T-SQL продовження рядків для розбиття довгих рядків?


13

У мене іноді є сценарій SQL, який має одну або кілька наддовгих (іноді навіть дурних) рядків. Зазвичай це VARBINARYлітерали / константи, які представляють файли / збори, але іноді вони є текстовими.

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

Друга проблема полягає в тому, що вона ускладнює форматування під час використання в редакторі без ввімкнення обговорення слів або публікації в Інтернеті. Проблема тут полягає в тому, що повзунок для горизонтальної смуги прокрутки дуже вузький, і переміщуючи його навіть небагато, як правило, прокручується не надто довгий текст з поля зору.

Тепер T-SQL не завершує команди з новими рядками або навіть напівколонами (хоча напівколонки є кращими / рекомендованими, починаючи з SQL Server 2005). Отже, оскільки SQL Server знає, як аналізувати кожне твердження таким чином, що воно знає, коли воно закінчується, здається, що розділення довгої лінії на кілька рядків, розділених лише a 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.