J'ai un code qui est:
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 longueur du script est d'environ 10 000 caractères et puisque j'utilise une instruction d'impression qui ne peut contenir que 8 000 caractères maximum. J'utilise donc deux instructions d'impression.
Le problème est que lorsque j'ai un script qui compte environ 18 000 caractères, j'utilisais 3 instructions d'impression.
Alors, y a-t-il un moyen de définir le nombre d'instructions d'impression en fonction de la longueur du script?
PRINT
ou êtes-vous ouvert à d'autres alternatives?Réponses:
Vous pouvez faire une
WHILE
boucle en fonction du décompte de la longueur de votre script divisé par 8000.PAR EXEMPLE:
la source
SUBSTR
et ne regarder que la partie que vous traitez à ce moment-là et itérer dessus ou si vous savez qu'il y aura un saut de ligne avant la limite de 8k à chaque fois, alors faites simplement laWHILE
ligne de recherche des pauses.print(substring(@script, @Counter * 8000, (@Counter + 1) * 8000))
d'imprimer mon script.Je sais que c'est une vieille question, mais ce que j'ai fait n'est pas mentionné ici.
Pour moi, ce qui suit a fonctionné.
la source
max
si.DECLARE @info NVARCHAR(MAX) = 'A';SET @info = REPLICATE(@info, 16000) + 'BC This is not printed';PRINT @info;PRINT CAST(@info AS NTEXT);
La solution de contournement suivante n'utilise pas l'
PRINT
instruction. Cela fonctionne bien en combinaison avec SQL Server Management Studio.Vous pouvez cliquer sur le XML renvoyé pour le développer dans le visualiseur XML intégré.
Il y a une limite côté client assez généreuse sur la taille affichée. Allez à
Tools/Options/Query Results/SQL Server/Results to Grid/XML data
pour l'ajuster si nécessaire.la source
<
est remplacé par<
.<root>....
comme:SELECT CAST(@MyLongString AS XML)
SELECT @MyLongString AS [processing-instruction(x)] FOR XML PATH('')
. La chaîne sera enveloppée dans un PI appelé "x", mais le PI ne sera pas enveloppé dans un autre élément (à cause dePATH('')
).Voici comment procéder:
Tiré de http://ask.sqlservercentral.com/questions/3102/any-way-around-the-print-limit-of-nvarcharmax-in-s.html
la source
Je suis tombé sur cette question et je voulais quelque chose de plus simple ... Essayez ce qui suit:
la source
SELECT CAST(@STMT AS XML)
comme déjà indiqué dans un autre commentaire. Produit exactement la même sortie et est en effet moins compliqué que de créer une procédure stockée pour la sortie.Cette procédure imprime correctement le
VARCHAR(MAX)
paramètre en tenant compte de l'encapsulation:la source
Je cherchais à utiliser l'instruction print pour déboguer un SQL dynamique car j'imagine que la plupart d'entre vous utilisent print pour des raisons similaires.
J'ai essayé quelques-unes des solutions répertoriées et j'ai trouvé que la solution de Kelsey fonctionne avec des tweeks mineurs (@sql est mon @script) nb LENGTH n'est pas une fonction valide:
Ce code fait comme commenté ajouter une nouvelle ligne dans la sortie, mais pour le débogage, ce n'est pas un problème pour moi.
La solution de Ben B est parfaite et est la plus élégante, bien que pour le débogage il y ait beaucoup de lignes de code, je choisis donc d'utiliser ma légère modification de Kelsey. Cela pourrait valoir la peine de créer un système comme une procédure stockée dans msdb pour le code de Ben B qui pourrait être réutilisé et appelé en une seule ligne?
Le code d'Alfoks ne fonctionne malheureusement pas car cela aurait été plus facile.
la source
Vous pouvez utiliser ceci
la source
Je viens de créer un SP à partir de la bonne réponse de Ben :
la source
la source
Il existe une excellente fonction appelée PrintMax écrite par Bennett Dill .
Voici une version légèrement modifiée qui utilise une procédure stockée temporaire pour éviter la "polution de schéma" (idée de https://github.com/Toolien/sp_GenMerge/blob/master/sp_GenMerge.sql )
Démo DBFiddle
ÉDITER:
En utilisant
CREATE OR ALTER
nous pourrions éviter deux appels EXEC:Démo db <> fiddle
la source
Utilise les sauts de ligne et les espaces comme bon point de rupture:
la source
Ou simplement:
la source
Voici une autre version. Celui-ci extrait chaque sous-chaîne à imprimer de la chaîne principale au lieu de prendre la réduction de la chaîne principale de 4000 sur chaque boucle (ce qui peut créer beaucoup de très longues chaînes sous le capot - pas sûr).
la source
Cela devrait fonctionner correctement, ce n'est qu'une amélioration des réponses précédentes.
la source
Si le code source n'aura pas de problèmes avec LF à remplacer par CRLF, aucun débogage n'est requis en suivant les sorties de codes simples.
la source
Ma version PrintMax pour éviter les mauvais sauts de ligne en sortie:
la source