Às vezes, tenho um script SQL que tem uma ou mais strings super longas (às vezes até estúpidas). Normalmente são VARBINARY
literais/constantes que representam arquivos/assemblies, mas ocasionalmente são texto.
O principal problema com strings realmente longas é que alguns editores de texto não lidam com elas muito bem. Por exemplo, tenho um VARBINARY
literal que uso em uma CREATE ASSEMBLY [AssemblyName] FROM 0x....
instrução e o próprio Assembly tem pouco mais de 1 MB de tamanho, o que equivale a pouco mais de 2 milhões de caracteres em um arquivo de texto, pois cada byte exige que dois caracteres sejam representados em notação hexadecimal (por exemplo 0x1F
= a 1
e an F
). O SQL Server Management Studio (SSMS) não lida bem com isso e trava por vários segundos enquanto tento rolar sobre essa linha. E, de fato, algumas versões (não tenho certeza se isso ainda acontece) exibirão até um aviso sobre linhas longas ao abrir um script que tenha pelo menos uma linha em um determinado comprimento.
Um problema secundário é que ele complica a formatação ao usar em um editor sem o Word-wrap habilitado ou ao postar online. O problema aqui é que o controle deslizante da barra de rolagem horizontal é muito estreito e movê-lo um pouco geralmente rola o texto não super longo para fora da vista.
Agora, o T-SQL não encerra comandos com novas linhas ou até mesmo ponto e vírgula (embora o ponto e vírgula seja preferido/recomendado, começando com o SQL Server 2005). Portanto, como o SQL Server sabe como analisar cada instrução de forma que saiba quando ela termina, parece que dividir a linha longa em várias linhas, separadas apenas por um newline/ carriage-return+ line-feed, não parece irracional. Mas isso não funciona em nenhum dos casos.
PRINT 'Line1
Line2';
retorna (na aba "Mensagens"):
Line1
Line2
E isso faz sentido o suficiente, pois a nova linha está dentro de um literal/constante. Mas fazer isso para um VARBINARY
também não funciona.
PRINT 0x1234
5678;
me dá um erro.
Felizmente, há suporte para continuação de linha no T-SQL por meio do \caractere (barra invertida). Basta colocar isso no final de uma linha, logo antes do newline/ carriage-return+ line-feed, e a nova linha será ignorada.
Para strings de texto, isso se comporta da seguinte forma:
retorna (na aba "Mensagens"):
Para strings binárias/hexadecimais, isso se comporta da seguinte forma:
retorna (na aba "Mensagens"):
Para formatar arquivos binários (Assemblies, Certificates) em strings de bytes hexadecimais de texto para uso em scripts SQL, escrevi um utilitário de linha de comando chamado BinaryFormatter que lancei como código aberto no GitHub. Ele não apenas converte o arquivo binário em uma representação de texto, mas também usa a continuação de linha para espalhar
VARBINARY
literais longos em quantas linhas forem necessárias, com base no número especificado de caracteres a serem usados por cada linha. O resultado é algo como:que eu copio e colo no meu script, conforme mostrado na
{...}
área abaixo:Para obter detalhes adicionais sobre este tópico, consulte minha postagem no blog: Line-Continuation in T-SQL