Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Maximale Größe einer varchar(max)-Variablen

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

fehl

REPLICATE: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