Så vidt jeg kan se er der ingen øvre grænse i 2008.
I SQL Server 2005 mislykkes koden i dit spørgsmål i tildelingen til @GGMMsg
variabel med
Forsøg på at vokse LOB ud over den maksimalt tilladte størrelse på 2.147.483.647 bytes.
koden nedenfor fejler med
REPLICATE:Længden af resultatet overskrider længdegrænsen (2 GB) for den store måltype.
Det ser dog ud til, at disse begrænsninger stille og roligt er blevet ophævet. I 2008
DECLARE @y VARCHAR(MAX) = REPLICATE(CAST('X' AS VARCHAR(MAX)),92681);
SET @y = REPLICATE(@y,92681);
SELECT LEN(@y)
Returnerer
8589767761
Jeg kørte dette på min 32 bit desktop maskine, så denne 8GB streng er langt over adresserbar hukommelse
Kører
select internal_objects_alloc_page_count
from sys.dm_db_task_space_usage
WHERE session_id = @@spid
Returneret
internal_objects_alloc_page_co
------------------------------
2144456
så jeg formoder, at det hele bare bliver gemt i LOB
sider i tempdb
uden validering af længde. Væksten i sideantal var alt forbundet med SET @y = REPLICATE(@y,92681);
udmelding. Den indledende variabeltildeling til @y
og LEN
beregning øgede ikke dette.
Grunden til at nævne dette er fordi sideantallet er enormt mere, end jeg havde forventet. Hvis man antager en 8KB side, så fungerer dette på 16,36 GB, hvilket åbenbart er mere eller mindre det dobbelte af, hvad der ser ud til at være nødvendigt. Jeg spekulerer i, at dette sandsynligvis skyldes ineffektiviteten af strengsammenkædningsoperationen, der skal kopiere hele den enorme streng og tilføje en del til enden i stedet for at kunne tilføje til enden af den eksisterende streng. Desværre i øjeblikket er .WRITE
metoden er ikke understøttet for varchar(max) variabler.
Tilføjelse
Jeg har også testet adfærden med at sammenkæde nvarchar(max) + nvarchar(max)
og nvarchar(max) + varchar(max)
. Begge disse gør det muligt at overskride grænsen på 2 GB. Forsøg på derefter at gemme resultaterne af dette i en tabel mislykkes dog med fejlmeddelelsen Attempting to grow LOB beyond maximum allowed size of 2147483647 bytes.
en gang til. Scriptet til det er nedenfor (det kan tage lang tid at køre).
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