Soweit ich das beurteilen kann, gibt es 2008 keine Obergrenze.
In SQL Server 2005 schlägt der Code in Ihrer Frage bei der Zuordnung zur @GGMMsg
Variablen mit fehl
Der Versuch, LOB über die maximal zulässige Größe von 2.147.483.647 Bytes hinaus zu vergrößern.
Der folgende Code schlägt mit fehl
REPLICATE: Die Länge des Ergebnisses überschreitet die Längenbeschränkung (2 GB) des großen Zieltyps.
Es scheint jedoch, dass diese Einschränkungen stillschweigend aufgehoben wurden. Im Jahr 2008
DECLARE @y VARCHAR(MAX) = REPLICATE(CAST('X' AS VARCHAR(MAX)),92681);
SET @y = REPLICATE(@y,92681);
SELECT LEN(@y)
Kehrt zurück
8589767761
Ich habe dies auf meinem 32-Bit-Desktop-Computer ausgeführt, sodass diese 8-GB-Zeichenfolge den adressierbaren Speicher weit übersteigt
Laufen
select internal_objects_alloc_page_count
from sys.dm_db_task_space_usage
WHERE session_id = @@spid
Ist zurückgekommen
internal_objects_alloc_page_co
------------------------------
2144456
Ich gehe also davon aus, dass dies alles nur auf LOB
Seiten tempdb
ohne Validierung der Länge gespeichert wird . Das Wachstum der Seitenzahl war alle mit der SET @y = REPLICATE(@y,92681);
Aussage verbunden. Die anfängliche Variablenzuordnung zu @y
und die LEN
Berechnung haben dies nicht erhöht.
Der Grund für die Erwähnung ist, dass die Seitenzahl enorm höher ist als ich erwartet hatte. Unter der Annahme einer 8-KB-Seite ergibt sich eine Größe von 16,36 GB, was offensichtlich mehr oder weniger doppelt so hoch ist, wie es notwendig erscheint. Ich spekuliere, dass dies wahrscheinlich auf die Ineffizienz der Zeichenfolgenverkettungsoperation zurückzuführen ist, bei der die gesamte große Zeichenfolge kopiert und ein Teil an das Ende angehängt werden muss, anstatt das Ende der vorhandenen Zeichenfolge hinzufügen zu können. Leider wird die .WRITE
Methode derzeit nicht für varchar (max) -Variablen unterstützt .
Zusatz
Ich habe auch das Verhalten mit Verkettung nvarchar(max) + nvarchar(max)
und getestet nvarchar(max) + varchar(max)
. In beiden Fällen kann das 2-GB-Limit überschritten werden. Der Versuch, die Ergebnisse davon in einer Tabelle zu speichern, schlägt jedoch mit der Fehlermeldung Attempting to grow LOB beyond maximum allowed size of 2147483647 bytes.
erneut fehl . Das Skript dafür finden Sie weiter unten (die Ausführung kann lange dauern).
DECLARE @y1 VARCHAR(MAX) = REPLICATE(CAST('X' AS VARCHAR(MAX)),2147483647);
SET @y1 = @y1 + @y1;
SELECT LEN(@y1), DATALENGTH(@y1) /*4294967294, 4294967292*/
DECLARE @y2 NVARCHAR(MAX) = REPLICATE(CAST('X' AS NVARCHAR(MAX)),1073741823);
SET @y2 = @y2 + @y2;
SELECT LEN(@y2), DATALENGTH(@y2) /*2147483646, 4294967292*/
DECLARE @y3 NVARCHAR(MAX) = @y2 + @y1
SELECT LEN(@y3), DATALENGTH(@y3) /*6442450940, 12884901880*/
/*This attempt fails*/
SELECT @y1 y1, @y2 y2, @y3 y3
INTO Test
declare @x varchar(max) = 'XX'; SELECT LEN(REPLICATE(@x,2147483647))
gibt4294967294
für mich aber dauert lange zu laufen - auch nachdem derSELECT
zurückgekehrt ist, also nicht sicher, was diese zusätzliche Zeit damit verbracht wird.