Per quanto ne so non esiste un limite massimo nel 2008.
In SQL Server 2005 il codice nella domanda non riesce nell'assegnazione alla @GGMMsg
variabile con
Tentativo di aumentare il LOB oltre la dimensione massima consentita di 2.147.483.647 byte.
il codice seguente non riesce con
REPLICARE: la lunghezza del risultato supera il limite di lunghezza (2 GB) del tipo grande di destinazione.
Tuttavia sembra che queste limitazioni siano state tranquillamente rimosse. Nel 2008
DECLARE @y VARCHAR(MAX) = REPLICATE(CAST('X' AS VARCHAR(MAX)),92681);
SET @y = REPLICATE(@y,92681);
SELECT LEN(@y)
ritorna
8589767761
L'ho eseguito sulla mia macchina desktop a 32 bit, quindi questa stringa da 8 GB è molto in eccesso rispetto alla memoria indirizzabile
In esecuzione
select internal_objects_alloc_page_count
from sys.dm_db_task_space_usage
WHERE session_id = @@spid
Restituito
internal_objects_alloc_page_co
2144456
quindi presumo che tutto questo venga memorizzato in LOB
pagine tempdb
senza convalida sulla lunghezza. La crescita del conteggio delle pagine era tutta associata alla SET @y = REPLICATE(@y,92681);
dichiarazione. L'assegnazione iniziale della variabile a @y
e il LEN
calcolo non hanno aumentato questo valore.
Il motivo per menzionare questo è perché il conteggio delle pagine è enormemente più di quanto mi aspettassi. Supponendo una pagina da 8 KB, allora questo funziona a 16,36 GB, che è ovviamente più o meno il doppio di quanto sembrerebbe necessario. Suppongo che ciò sia probabilmente dovuto all'inefficienza dell'operazione di concatenazione di stringhe che richiede di copiare l'intera stringa enorme e aggiungere un pezzo alla fine piuttosto che essere in grado di aggiungere alla fine della stringa esistente. Purtroppo al momento il .WRITE
metodo non è supportato per le variabili varchar (max).
Aggiunta
Ho anche testato il comportamento con la concatenazione nvarchar(max) + nvarchar(max)
e nvarchar(max) + varchar(max)
. Entrambi consentono di superare il limite di 2 GB. Il tentativo di memorizzare i risultati di ciò in una tabella, tuttavia, fallisce Attempting to grow LOB beyond maximum allowed size of 2147483647 bytes.
nuovamente con il messaggio di errore . Lo script per questo è di seguito (potrebbe richiedere molto tempo per essere eseguito).
DECLARE @y1 VARCHAR(MAX) = REPLICATE(CAST('X' AS VARCHAR(MAX)),2147483647);
SET @y1 = @y1 + @y1;
SELECT LEN(@y1), DATALENGTH(@y1)
DECLARE @y2 NVARCHAR(MAX) = REPLICATE(CAST('X' AS NVARCHAR(MAX)),1073741823);
SET @y2 = @y2 + @y2;
SELECT LEN(@y2), DATALENGTH(@y2)
DECLARE @y3 NVARCHAR(MAX) = @y2 + @y1
SELECT LEN(@y3), DATALENGTH(@y3)
SELECT @y1 y1, @y2 y2, @y3 y3
INTO Test
declare @x varchar(max) = 'XX'; SELECT LEN(REPLICATE(@x,2147483647))
dà4294967294
per me ma impiega molto tempo a correre, anche dopo cheSELECT
è tornato, quindi non sono sicuro di cosa sia speso a fare quel tempo extra.