Tengo un código que es:
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)
La longitud de la secuencia de comandos es de alrededor de 10,000 caracteres y, dado que estoy usando una declaración impresa, solo puede contener un máximo de 8000. Por lo tanto, estoy usando dos declaraciones impresas.
El problema es que cuando tengo un script que tiene, digamos, 18000 caracteres, solía usar 3 declaraciones de impresión.
Entonces, ¿hay alguna manera de establecer el número de declaraciones de impresión en función de la longitud del script?
PRINT
o estás abierto a otras alternativas?Respuestas:
Puede hacer un
WHILE
bucle basado en el recuento de la longitud de su script dividido por 8000.P.EJ:
fuente
SUBSTR
y mirar solo la parte con la que está tratando en ese momento e iterar sobre eso o si sabe que habrá un salto de línea antes del límite de 8k cada vez, simplemente haga loWHILE
basado en encontrar la línea rompe.print(substring(@script, @Counter * 8000, (@Counter + 1) * 8000))
imprimir mi guión.Sé que es una vieja pregunta, pero lo que hice no se menciona aquí.
Para mí funcionó lo siguiente.
fuente
max
aunque.DECLARE @info NVARCHAR(MAX) = 'A';SET @info = REPLICATE(@info, 16000) + 'BC This is not printed';PRINT @info;PRINT CAST(@info AS NTEXT);
La siguiente solución alternativa no utiliza la
PRINT
declaración. Funciona bien en combinación con SQL Server Management Studio.Puede hacer clic en el XML devuelto para expandirlo en el visor XML integrado.
Hay un límite bastante generoso del lado del cliente en el tamaño mostrado. Vaya a
Tools/Options/Query Results/SQL Server/Results to Grid/XML data
para ajustarlo si es necesario.fuente
<
se reemplaza por<
.<root>....
gusta:SELECT CAST(@MyLongString AS XML)
SELECT @MyLongString AS [processing-instruction(x)] FOR XML PATH('')
. La cadena estará envuelta en un PI llamado "x", pero el PI no estará envuelto en otro elemento (debido aPATH('')
).Así es como se debe hacer esto:
Tomado de http://ask.sqlservercentral.com/questions/3102/any-way-around-the-print-limit-of-nvarcharmax-in-s.html
fuente
Encontré esta pregunta y quería algo más simple ... Intente lo siguiente:
fuente
SELECT CAST(@STMT AS XML)
como ya se dijo en otro comentario. Produce exactamente la misma salida y, de hecho, es menos complicado que crear un procedimiento almacenado para la salida.Este proceso imprime correctamente el
VARCHAR(MAX)
parámetro considerando el ajuste:fuente
Estaba buscando usar la declaración de impresión para depurar algún SQL dinámico, ya que imagino que la mayoría de ustedes está usando la impresión por razones similares.
Probé algunas de las soluciones enumeradas y descubrí que la solución de Kelsey funciona con ajustes menores (@sql es mi @script) nb LENGTH no es una función válida:
Este código, como se comentó, agrega una nueva línea a la salida, pero para depurar esto no es un problema para mí.
La solución de Ben B es perfecta y es la más elegante, aunque para la depuración hay muchas líneas de código, así que elijo usar mi pequeña modificación de Kelsey. ¿Podría valer la pena crear un sistema como un procedimiento almacenado en msdb para el código de Ben B que podría reutilizarse y llamarse en una línea?
El código de Alfoks no funciona desafortunadamente porque eso hubiera sido más fácil.
fuente
Puedes usar esto
fuente
Acabo de crear un SP a partir de la gran respuesta de Ben :
fuente
fuente
Hay una gran función llamada PrintMax escrita por Bennett Dill .
Aquí hay una versión ligeramente modificada que usa un procedimiento almacenado temporal para evitar la "contaminación del esquema" (idea de https://github.com/Toolien/sp_GenMerge/blob/master/sp_GenMerge.sql )
Demostración de DBFiddle
EDITAR:
Usando
CREATE OR ALTER
podríamos evitar dos llamadas EXEC:db <> demostración de violín
fuente
Utiliza saltos de línea y espacios como un buen punto de interrupción:
fuente
O simplemente:
fuente
Aquí tienes otra versión. Este extrae cada subcadena para imprimir de la cadena principal en lugar de reducir la cadena principal en 4000 en cada bucle (lo que podría crear muchas cadenas muy largas debajo del capó, no estoy seguro).
fuente
Esto debería funcionar correctamente, esto es solo una mejora de las respuestas anteriores.
fuente
Si el código fuente no tendrá problemas con LF para ser reemplazado por CRLF, no se requiere depuración siguiendo las salidas de códigos simples.
fuente
Mi versión PrintMax para evitar saltos de línea defectuosos en la salida:
fuente