T-SQL-Datentyp VARCHAR(MAX) Abgeschnitten
DECLARE @str VARCHAR (MAX);
SELECT @str = COALESCE(@str + CHAR(10), '') +
'EXECUTE CreateDeno ' + CAST(ID AS VARCHAR)
FROM GL_To_Batch_Details
WHERE TYPE = 'C' AND
Deno_ID IS NULL;
--PRINT @str;--SELECT @str;
**EXEC(@str);**
BEARBEITET
Tut EXECUTE
Anweisung kürzen von Zeichenfolgen zu 8.000 Zeichen wie PRINT
? Wie kann ich führen Sie eine dynamische SQL-Anweisung mit mehr als 8.000 chars?
Jede Anregung wäre herzlich willkommen.
- Ich denke, Sie sind verwirrt, Sie können nicht
PRINT
mehr als 8000 Zeichen hat, bedeutet das nicht, dass @str ist abgeschnitten - Ich habe bearbeitet die Frage, um genauer zu sein auf das problem. Eigentlich, wenn Sie AUSFÜHREN, produziert die Fehler, die ich verwendet zu DRUCKEN, um zu sehen, was war das dynamische T-SQL generiert. In beiden Fällen, nvarchar(MAX) - Werte hatte, wurde abgeschnitten. Irgendwelche Ideen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
PRINT
ist beschränkt auf 8k Ausgabe.Gibt es auch eine 8k-Grenze in SSMS Ergebnisbereich.
Gehen
tools -> Optionen -> query Ergebnisse
um die Optionen zu sehen.
Überprüfen Sie die Länge der eigentlichen Daten-check:
SELECT LEN(@str)
Beim verketten von strings und das Ergebnis ist vom Typ VARCHAR(MAX) und ist mit über 8000 Zeichen, mindestens eine parameter und/oder ein element verwendet wird, in die Verkettung müssen die VARCHAR(MAX) geben, sonst kommt es zu einer Abschneidung, in der resultierenden Zeichenfolge und werden nicht ausführbare Datei in eine EXEC-Anweisung.
Beispiel:
Mehr Informationen auf MSDN.
Den Standard-Länge einer
varchar
ist 30 Zeichen:Ist es möglich, dass
id
ist länger als 30 Zeichen?Den
PRINT
Befehl ist sicherlich begrenzt auf 8000 chars, unabhängig von der Länge der Ausgabe ist (oder ob es ist vom Datentyp varchar(max)). Um dies zu umgehen, müssen Sie die Ausgabe der Zeichenfolge in Blöcken von<8000
charsUpdate: In Antwort auf Ihre Bearbeiten, exec nicht begrenzen Sie die Länge der Zeichenfolge. Ich habe das folgende Beispiel zeigen:
Läuft dies druckt die Länge als 34892 chars, und alle 2000 execute-Anweisungen ausführen (seien Sie gewarnt, es dauert ein paar Minuten!)
Es passiert, wenn Sie Literale verketten, wenn man nicht den Datentyp varchar(max), wird das Ergebnis schlecht sein "implizit gecastet" auf varchar(8000).
Erzeugen ein literal vom Datentyp varchar(max) alle Teile müssen vom Datentyp varchar(max).
Hinweis: Es passiert mir tut updates auf varchar(max) - Spalten, nie getestet mit der EXEC-Befehl.
Auch wie bereits in vorherigen Antworten der print-Befehl hält eine Grenze, aber Sie können versuchen Sie, die variable statt dem drucken. (auch dort ist eine Grenze markieren Sie die Länge, die Sie konfigurieren können, die auf MS-SMS)
Außerdem wollte ich sehen, was ich geschickt wurde, um Exec, und war verwirrt durch die PRINT-limit. Hatte zu schreiben, ein proc zu drucken, in Stücke schneiden.