¿SQL Server / T-SQL admite la continuación de línea para dividir cadenas largas?


13

A veces tengo un script SQL que tiene una o más cadenas súper largas (a veces incluso estúpidas). Por lo general, estos son VARBINARYliterales / constantes que representan archivos / ensamblados, pero ocasionalmente son texto.

El principal problema con las cadenas realmente largas es que algunos editores de texto no las manejan tan bien. Por ejemplo, tengo un VARBINARYliteral que uso en una CREATE ASSEMBLY [AssemblyName] FROM 0x....declaración, y el ensamblaje en sí tiene un tamaño de poco más de 1 MB, lo que equivale a poco más de 2 millones de caracteres en un archivo de texto, ya que cada byte requiere que dos caracteres se representen en notación hexadecimal (por ejemplo, 0x1Fa 1y an F). SQL Server Management Studio (SSMS) no maneja esto bien y se cuelga durante varios segundos mientras intento desplazarme por esa línea. Y, de hecho, algunas versiones (no estoy seguro de si esto todavía sucede) incluso mostrarán una advertencia sobre las líneas largas al abrir un script que tenga al menos una línea en una longitud determinada.

Un problema secundario es que complica el formato cuando se usa en un editor sin el ajuste de texto habilitado o cuando se publica en línea. El problema aquí es que el control deslizante de la barra de desplazamiento horizontal es muy angosto y moverlo aunque sea un poco por lo general desplaza el texto no muy largo fuera de la vista.

Ahora, T-SQL no termina los comandos con líneas nuevas o incluso con punto y coma (aunque se prefieren / recomiendan los punto y coma, comenzando con SQL Server 2005). Entonces, dado que SQL Server sabe cómo analizar cada declaración de manera que sepa cuándo termina, parece que dividir la línea larga en varias líneas, separadas solo por un newline/ carriage-return+ line-feed, no parece irrazonable. Pero esto no funciona en ninguno de los casos.

PRINT 'Line1
Line2';

devoluciones (en la pestaña "Mensajes"):

Line1
Line2

Y eso tiene bastante sentido ya que la nueva línea está dentro de un literal / constante. Pero hacer esto por un VARBINARYtambién no funciona.

PRINT 0x1234
5678;

me da un error

Respuestas:


13

Afortunadamente, hay soporte para la continuación de línea en T-SQL a través del carácter \(barra diagonal inversa). Simplemente colóquelo al final de una línea, justo antes de newline/ carriage-return/ line-feed, y la nueva línea será ignorada.

Para cadenas de texto, esto se comporta de la siguiente manera:

PRINT 'Line1\
Line2';

devoluciones (en la pestaña "Mensajes"):

Line1Line2

Para cadenas binarias / hexadecimales, esto se comporta de la siguiente manera:

PRINT 0x1234\
5678;

devoluciones (en la pestaña "Mensajes"):

0x12345678;

Para formatear archivos binarios (ensamblados, certificados) en cadenas de bytes hexadecimales de texto para usar en scripts SQL, escribí una utilidad de línea de comandos llamada BinaryFormatter que he lanzado como código abierto en GitHub. No solo convierte el archivo binario en una representación de texto, sino que también utiliza la continuación de línea para distribuir VARBINARYliterales largos en la cantidad de filas necesarias, según el número de caracteres especificado para cada fila. El resultado es algo similar a:

4D5A09DE34F178313345A4\
00007F4E39782EFC48D842\
00000000

que luego copio y pego en mi script, como se muestra en el {...}área a continuación:

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

Para obtener detalles adicionales sobre este tema, consulte la publicación de mi blog: Continuación de línea en T-SQL

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.