Ich habe einen Code, der lautet:
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)
Die Länge des Skripts beträgt ungefähr 10.000 Zeichen. Da ich eine Druckanweisung verwende, die nur maximal 8000 Zeichen enthalten kann, verwende ich zwei Druckanweisungen.
Das Problem ist, wenn ich ein Skript mit beispielsweise 18000 Zeichen habe, habe ich 3 print-Anweisungen verwendet.
Gibt es eine Möglichkeit, die Anzahl der Druckanweisungen abhängig von der Länge des Skripts festzulegen?
PRINT
andere Alternativen nutzen oder sind Sie offen dafür?Antworten:
Sie können eine
WHILE
Schleife basierend auf der Anzahl Ihrer Skriptlängen geteilt durch 8000 erstellen.Z.B:
quelle
SUBSTR
und nur den Teil betrachten, mit dem Sie sich gerade befassen, und diesen wiederholen. Wenn Sie wissen, dass jedes Mal vor dem 8-KB-Grenzwert ein Zeilenumbruch auftritt, führen Sie einfach dieWHILE
auf der Suche basierende Zeile aus geht kaputt.print(substring(@script, @Counter * 8000, (@Counter + 1) * 8000))
mein Skript gedruckt.Ich weiß, dass es eine alte Frage ist, aber was ich getan habe, wird hier nicht erwähnt.
Für mich hat folgendes funktioniert.
quelle
max
obwohl.DECLARE @info NVARCHAR(MAX) = 'A';SET @info = REPLICATE(@info, 16000) + 'BC This is not printed';PRINT @info;PRINT CAST(@info AS NTEXT);
Die folgende Problemumgehung verwendet die
PRINT
Anweisung nicht. Es funktioniert gut in Kombination mit SQL Server Management Studio.Sie können auf das zurückgegebene XML klicken, um es im integrierten XML-Viewer zu erweitern.
Es gibt eine ziemlich großzügige clientseitige Begrenzung für die angezeigte Größe. Gehen Sie zu
Tools/Options/Query Results/SQL Server/Results to Grid/XML data
, um es bei Bedarf anzupassen.quelle
<
wird durch ersetzt<
.<root>....
:SELECT CAST(@MyLongString AS XML)
SELECT @MyLongString AS [processing-instruction(x)] FOR XML PATH('')
. Die Zeichenfolge wird in einen PI mit dem Namen "x" eingeschlossen, aber der PI wird (wegenPATH('')
) nicht in ein anderes Element eingeschlossen .So sollte das gemacht werden:
Entnommen aus http://ask.sqlservercentral.com/questions/3102/any-way-around-the-print-limit-of-nvarcharmax-in-s.html
quelle
Kam über diese Frage und wollte etwas Einfacheres ... Versuchen Sie Folgendes:
quelle
SELECT CAST(@STMT AS XML)
wie bereits in einem anderen Kommentar erwähnt. Erzeugt genau die gleiche Ausgabe und ist in der Tat weniger kompliziert als das Erstellen einer gespeicherten Prozedur für die Ausgabe.Dieser Prozess druckt den
VARCHAR(MAX)
Parameter unter Berücksichtigung des Umbringens korrekt aus :quelle
Ich wollte die print-Anweisung verwenden, um einige dynamische SQL-Dateien zu debuggen, da ich mir vorstelle, dass die meisten von Ihnen print aus ähnlichen Gründen verwenden.
Ich habe einige der aufgelisteten Lösungen ausprobiert und festgestellt, dass Kelseys Lösung mit kleinen Wochen funktioniert (@sql ist mein @script). Nb LENGTH ist keine gültige Funktion:
Dieser Code fügt wie kommentiert eine neue Zeile in die Ausgabe ein, aber für das Debuggen ist dies für mich kein Problem.
Die Lösung von Ben B ist perfekt und die eleganteste, obwohl das Debuggen viele Codezeilen umfasst, sodass ich meine geringfügige Modifikation von Kelsey verwende. Es könnte sich lohnen, ein System wie eine gespeicherte Prozedur in msdb für den Code von Ben B zu erstellen, das in einer Zeile wiederverwendet und aufgerufen werden kann.
Der Code von Alfoks funktioniert leider nicht, weil das einfacher gewesen wäre.
quelle
Sie können dies verwenden
quelle
Ich habe gerade einen SP aus Bens großartiger Antwort erstellt :
quelle
quelle
Es gibt eine großartige Funktion namens PrintMax, die von Bennett Dill geschrieben wurde .
Hier ist eine leicht modifizierte Version, die temporäre gespeicherte Prozeduren verwendet, um "Schema-Verschmutzung" zu vermeiden (Idee von https://github.com/Toolien/sp_GenMerge/blob/master/sp_GenMerge.sql ).
DBFiddle Demo
BEARBEITEN:
Mit
CREATE OR ALTER
könnten wir zwei EXEC-Aufrufe vermeiden:db <> fiddle Demo
quelle
Verwendet Zeilenvorschübe und Leerzeichen als guten Haltepunkt:
quelle
Oder einfach:
quelle
Hier ist eine andere Version. Dieser extrahiert jeden zu druckenden Teilstring aus der Hauptzeichenfolge, anstatt die Hauptzeichenfolge in jeder Schleife um 4000 zu reduzieren (was unter der Haube viele sehr lange Zeichenfolgen erzeugen kann - nicht sicher).
quelle
Dies sollte ordnungsgemäß funktionieren. Dies ist nur eine Verbesserung der vorherigen Antworten.
quelle
Wenn der Quellcode keine Probleme mit LF hat, die durch CRLF ersetzt werden sollen, ist kein Debuggen erforderlich, indem einfache Code-Ausgaben befolgt werden.
quelle
Meine PrintMax-Version zur Vermeidung fehlerhafter Zeilenumbrüche bei der Ausgabe:
quelle