Por lo que yo puedo decir que no hay límite superior en 2008.
En SQL Server 2005 el código en su pregunta falla en la asignación a la variable @GGMMsg
con
Intentando para crecer LOB más allá del tamaño máximo permitido de 2,147,483,647 bytes.
el código de abajo falla con
REPLICATE: La longitud del resultado excede el límite de longitud de (2 GB) de la gran tipo de destino.
Sin embargo, parece que estas limitaciones se han levantado silenciosamente.En 2008
DECLARE @y VARCHAR(MAX) = REPLICATE(CAST('X' AS VARCHAR(MAX)),92681);
SET @y = REPLICATE(@y,92681);
SELECT LEN(@y)
devoluciones
8589767761
me encontré con esto en mi máquina de escritorio de 32 bits por lo que esta cadena de 8 GB es la forma en exceso de memoria direccionable
Correr
select internal_objects_alloc_page_count
from sys.dm_db_task_space_usage
WHERE session_id = @@spid
devueltos
internal_objects_alloc_page_co
------------------------------
2144456
así que supongo que todo esto se almacena en LOB
páginas en tempdb
sin validación de longitud. El crecimiento del conteo de páginas estuvo asociado con la declaración SET @y = REPLICATE(@y,92681);
. La asignación de variable inicial a @y
y el cálculo LEN
no aumentó esto.
La razón para mencionar esto es porque el número de páginas es mucho más de lo que esperaba. Asumiendo una página de 8KB, esto da un resultado de 16.36 GB, lo que obviamente es más o menos el doble de lo que parece ser necesario. Supongo que esto se debe probablemente a la ineficacia de la operación de concatenación de cadenas que necesita copiar toda la cadena enorme y agregar un fragmento al final en lugar de poder agregarlo al final de la cadena existente. Lamentablemente, en este momento el .WRITE
método isn't supported para variables varchar (max).
adición
También hemos probado el comportamiento con la concatenación de nvarchar(max) + nvarchar(max)
y nvarchar(max) + varchar(max)
. Ambos permiten superar el límite de 2 GB. Sin embargo, intentar almacenar los resultados de esto en una tabla falla pero con el mensaje de error Attempting to grow LOB beyond maximum allowed size of 2147483647 bytes.
nuevamente. La secuencia de comandos para eso está debajo (puede tomar mucho tiempo para ejecutarse).
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
'declare @x varchar (max) = 'XX'; SELECT LEN (REPLICATE (@ x, 2147483647)) 'da' 4294967294', pero tarda mucho tiempo en ejecutarse, incluso después de que ha regresado el 'SELECT', por lo que no estoy seguro de qué tiempo extra dedico a hacerlo. –