Pokud mohu říci, v roce 2008 neexistuje žádná horní hranice.
V SQL Server 2005 kód ve vaší otázce selže při přiřazení k @GGMMsg
proměnná s
Pokus o zvětšení LOB nad maximální povolenou velikost 2 147 483 647 bajtů.
níže uvedený kód selže s
REPLICATE:Délka výsledku překračuje limit délky (2 GB) cílového velkého typu.
Zdá se však, že tato omezení byla v tichosti zrušena. V roce 2008
DECLARE @y VARCHAR(MAX) = REPLICATE(CAST('X' AS VARCHAR(MAX)),92681);
SET @y = REPLICATE(@y,92681);
SELECT LEN(@y)
Vrátí
8589767761
Spustil jsem to na svém 32bitovém stolním počítači, takže tento 8GB řetězec je mnohem více než adresovatelná paměť
Spuštěno
select internal_objects_alloc_page_count
from sys.dm_db_task_space_usage
WHERE session_id = @@spid
Vráceno
internal_objects_alloc_page_co
------------------------------
2144456
takže předpokládám, že se to všechno uloží do LOB
stránky v tempdb
bez ověření délky. Nárůst počtu stránek byl spojen s SET @y = REPLICATE(@y,92681);
prohlášení. Počáteční přiřazení proměnné k @y
a LEN
výpočet to nezvýšil.
Důvodem pro zmínku je to, že počet stránek je mnohem větší, než jsem očekával. Za předpokladu 8KB stránky to vyjde na 16,36 GB, což je samozřejmě víceméně dvojnásobek toho, co se zdá být nutné. Domnívám se, že je to pravděpodobně způsobeno neefektivitou operace zřetězení řetězců, která potřebuje zkopírovat celý obrovský řetězec a přidat kus na konec, místo aby bylo možné přidat na konec existujícího řetězce. Bohužel v tuto chvíli .WRITE
metoda není podporována pro proměnné varchar(max).
Přidání
Také jsem testoval chování se zřetězením nvarchar(max) + nvarchar(max)
a nvarchar(max) + varchar(max)
. Oba tyto umožňují překročení limitu 2 GB. Pokus o uložení výsledků do tabulky však selže s chybovou zprávou Attempting to grow LOB beyond maximum allowed size of 2147483647 bytes.
znovu. Skript pro to je níže (spuštění může trvat dlouho).
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