Soweit ich das beurteilen kann, gibt es 2008 keine Obergrenze.
In SQL Server 2005 schlägt der Code in Ihrer Frage bei der Zuweisung zu @GGMMsg
fehl Variable mit
Versuch, LOB über die maximal zulässige Größe von 2.147.483.647 Byte hinaus zu vergrößern.
Der folgende Code schlägt mit
fehlREPLICATE:Die Länge des Ergebnisses überschreitet die Längenbegrenzung (2 GB) des großen Zieltyps.
Es scheint jedoch, dass diese Einschränkungen stillschweigend aufgehoben wurden. 2008
DECLARE @y VARCHAR(MAX) = REPLICATE(CAST('X' AS VARCHAR(MAX)),92681);
SET @y = REPLICATE(@y,92681);
SELECT LEN(@y)
Rückgabe
8589767761
Ich habe dies auf meinem 32-Bit-Desktop-Computer ausgeführt, sodass diese 8-GB-Zeichenfolge weit über dem adressierbaren Speicher liegt
Laufen
select internal_objects_alloc_page_count
from sys.dm_db_task_space_usage
WHERE session_id = @@spid
Zurückgegeben
internal_objects_alloc_page_co
------------------------------
2144456
also nehme ich an, dass das alles nur in LOB
gespeichert wird Seiten in tempdb
ohne Überprüfung der Länge. Das Wachstum der Seitenzahl wurde vollständig mit SET @y = REPLICATE(@y,92681);
in Verbindung gebracht Erklärung. Die anfängliche Variablenzuweisung an @y
und die LEN
Berechnung hat dies nicht erhöht.
Der Grund für die Erwähnung ist, dass die Seitenzahl erheblich höher ist, als ich erwartet hatte. Geht man von einer 8-KB-Seite aus, dann ergibt das 16,36 GB, was offensichtlich mehr oder weniger das Doppelte dessen ist, was notwendig zu sein scheint. Ich spekuliere, dass dies wahrscheinlich auf die Ineffizienz der Zeichenfolgenverkettungsoperation zurückzuführen ist, die erforderlich ist, um die gesamte große Zeichenfolge zu kopieren und einen Teil an das Ende anzuhängen, anstatt am Ende der vorhandenen Zeichenfolge etwas hinzufügen zu können. Leider im Moment die .WRITE
-Methode wird für varchar(max)-Variablen nicht unterstützt.
Zusatz
Ich habe das Verhalten auch mit der Verkettung von nvarchar(max) + nvarchar(max)
getestet und nvarchar(max) + varchar(max)
. Beide erlauben das Überschreiten der 2GB-Grenze. Der Versuch, die Ergebnisse davon dann in einer Tabelle zu speichern, scheitert dann jedoch mit der Fehlermeldung Attempting to grow LOB beyond maximum allowed size of 2147483647 bytes.
wieder. Das Skript dafür ist unten (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