O SQL Server / T-SQL oferece suporte à continuação de linha para interromper seqüências longas?

13

Às vezes, tenho um script SQL que possui uma ou mais seqüências super longas (às vezes até estúpidas). Normalmente, são VARBINARYliterais / constantes que representam arquivos / Assemblies, mas ocasionalmente são textos.

O principal problema com sequências muito longas é que alguns editores de texto não lidam com elas muito bem. Por exemplo, eu tenho um VARBINARYliteral que eu uso em uma CREATE ASSEMBLY [AssemblyName] FROM 0x....declaraçã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 1e an F). O SQL Server Management Studio (SSMS) não lida com isso muito bem e trava por alguns segundos enquanto tento rolar a linha. E, de fato, algumas versões (sem saber se isso ainda acontece) exibirão um aviso sobre linhas longas ao abrir um script que tenha pelo menos uma linha em um determinado comprimento.

Uma questão secundária é que ela complica a formatação ao usar em um editor sem a opção de quebra de linha ativada ou postar online. O problema aqui é que o controle deslizante da barra de rolagem horizontal é muito estreito e movê-lo, mesmo que um pouco, geralmente rola o texto não muito longo para fora da vista.

Agora, o T-SQL não encerra comandos com novas linhas ou mesmo ponto e vírgula (embora os pontos e vírgulas sejam preferidos / recomendados, começando no SQL Server 2005). Portanto, como o SQL Server sabe analisar cada instrução de modo que saiba quando termina, parece que dividir a linha longa por várias linhas, separadas apenas por um newline/ carriage-return+ line-feed, não parece irracional. Mas isso não funciona nos dois casos.

PRINT 'Line1
Line2';

retorna (na guia "Mensagens"):

Line1
Line2

E isso faz sentido o suficiente, pois a nova linha está dentro de uma constante literal /. Mas fazer isso por um VARBINARYtambém não funciona.

PRINT 0x1234
5678;

me dá um erro.

Solomon Rutzky
fonte

Respostas:

13

Felizmente, há suporte para continuação de linha no T-SQL por meio do \caractere (barra invertida). Coloque isso no final de uma linha, logo antes do newline/ carriage-return+ line-feed, e a nova linha será ignorada.

Para cadeias de texto, isso se comporta da seguinte maneira:

PRINT 'Line1\
Line2';

retorna (na guia "Mensagens"):

Line1Line2

Para seqüências binárias / hexadecimais, isso se comporta da seguinte maneira:

PRINT 0x1234\
5678;

retorna (na guia "Mensagens"):

0x12345678;

Para formatar arquivos binários (Assemblies, Certificates) em cadeias de caracteres de texto hexadecimal para uso em scripts SQL, escrevi um utilitário de linha de comando chamado BinaryFormatter que eu liberei como código aberto no GitHub. Ele não apenas converte arquivo binário em uma representação de texto, mas também usa a continuação de linha para espalhar VARBINARYliterais longos por quantas linhas forem necessárias, com base no número especificado de caracteres a ser usado em cada linha. O resultado é algo como:

4D5A09DE34F178313345A4\
00007F4E39782EFC48D842\
00000000

que copio e colo no meu script, conforme mostrado na {...}área abaixo:

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

Para obter detalhes adicionais sobre este tópico, consulte minha postagem no blog: Continuação de linha em T-SQL

Solomon Rutzky
fonte