Eu tenho um código que é:
DECLARE @Script VARCHAR(MAX)
SELECT @Script = definition FROM manged.sys.all_sql_modules sq
where sq.object_id = (SELECT object_id from managed.sys.objects
Where type = 'P' and Name = 'usp_gen_data')
Declare @Pos int
SELECT @pos=CHARINDEX(CHAR(13)+CHAR(10),@script,7500)
PRINT SUBSTRING(@Script,1,@Pos)
PRINT SUBSTRING(@script,@pos,8000)
O comprimento do Script é de cerca de 10.000 caracteres e, como estou usando a declaração de impressão, ela pode conter no máximo 8.000. Portanto, estou usando duas declarações de impressão.
O problema é quando eu tenho um script que tem, digamos, 18.000 caracteres, então eu costumava usar 3 instruções de impressão.
Portanto, há uma maneira de definir o número de declarações de impressão dependendo do comprimento do script?
PRINT
ou está aberto a outras alternativas?Respostas:
Você poderia fazer um
WHILE
loop com base na contagem do comprimento do seu script dividido por 8.000.POR EXEMPLO:
fonte
SUBSTR
e olhar apenas para a parte com a qual está lidando no momento e iterar nela ou se você souber que haverá uma quebra de linha antes do limite de 8k a cada vez, então faça apenas comWHILE
base na descoberta da linha rompe.print(substring(@script, @Counter * 8000, (@Counter + 1) * 8000))
imprimir meu script.Sei que é uma pergunta antiga, mas o que fiz não é mencionado aqui.
Para mim, o seguinte funcionou.
fonte
max
que antes.DECLARE @info NVARCHAR(MAX) = 'A';SET @info = REPLICATE(@info, 16000) + 'BC This is not printed';PRINT @info;PRINT CAST(@info AS NTEXT);
A seguinte solução alternativa não usa a
PRINT
instrução. Ele funciona bem em combinação com o SQL Server Management Studio.Você pode clicar no XML retornado para expandi-lo no visualizador XML integrado.
Há um limite do lado do cliente bastante generoso no tamanho exibido. Vá para
Tools/Options/Query Results/SQL Server/Results to Grid/XML data
para ajustá-lo, se necessário.fonte
<
é substituído por<
.<root>....
gostar de:SELECT CAST(@MyLongString AS XML)
SELECT @MyLongString AS [processing-instruction(x)] FOR XML PATH('')
. A string será agrupada em um PI chamado "x", mas o PI não será agrupado em outro elemento (por causa dePATH('')
).Veja como isso deve ser feito:
Retirado de http://ask.sqlservercentral.com/questions/3102/any-way-around-the-print-limit-of-nvarcharmax-in-s.html
fonte
Encontrei esta pergunta e queria algo mais simples ... Experimente o seguinte:
fonte
SELECT CAST(@STMT AS XML)
já afirmado em outro comentário. Produz exatamente a mesma saída e é menos complicado do que criar um procedimento armazenado para saída.Este proc imprime corretamente o
VARCHAR(MAX)
parâmetro considerando o empacotamento:fonte
Eu estava tentando usar a instrução print para depurar algum sql dinâmico, já que imagino que a maioria de vocês está usando print por motivos semelhantes.
Tentei algumas das soluções listadas e descobri que a solução de Kelsey funciona com pequenos ajustes (@sql é meu @script) nb LENGTH não é uma função válida:
Este código adiciona uma nova linha à saída, conforme comentado, mas para depurar isso não é um problema para mim.
A solução de Ben B é perfeita e é a mais elegante, embora para depuração haja muitas linhas de código, então escolho usar minha pequena modificação da de Kelsey. Pode valer a pena criar um sistema como procedimento armazenado em msdb para o código de Ben B, que pode ser reutilizado e chamado em uma linha?
O código do Alfoks não funciona, infelizmente, porque isso teria sido mais fácil.
fonte
Você pode usar isso
fonte
Acabei de criar um SP a partir da ótima resposta de Ben :
fonte
fonte
Existe uma grande função chamada PrintMax escrita por Bennett Dill .
Aqui está uma versão ligeiramente modificada que usa procedimento armazenado temporário para evitar "poluição do esquema" (ideia de https://github.com/Toolien/sp_GenMerge/blob/master/sp_GenMerge.sql )
DBFiddle Demo
EDITAR:
Usando
CREATE OR ALTER
, poderíamos evitar duas chamadas EXEC:db <> demonstração de violino
fonte
Usa feeds de linha e espaços como um bom ponto de interrupção:
fonte
Ou simplesmente:
fonte
Aqui está outra versão. Este extrai cada substring para imprimir da string principal em vez de reduzir a string principal em 4000 em cada loop (o que pode criar muitas strings muito longas sob o capô - não tenho certeza).
fonte
Isso deve funcionar corretamente - é apenas uma melhoria das respostas anteriores.
fonte
Se o código-fonte não tiver problemas com LF para ser substituído por CRLF, nenhuma depuração é necessária seguindo as saídas de códigos simples.
fonte
Minha versão PrintMax para evitar quebras de linha ruins na saída:
fonte