Por lo que puedo decir, no hay límite superior en 2008.
En SQL Server 2005, el código de su pregunta falla en la asignación a la @GGMMsg
variable con
Intentando hacer crecer LOB más allá del tamaño máximo permitido de 2,147,483,647 bytes.
el siguiente código falla con
REPLICAR: la longitud del resultado supera el límite de longitud (2 GB) del tipo grande de destino.
Sin embargo, parece que estas limitaciones se han eliminado silenciosamente. En 2008
DECLARE @y VARCHAR(MAX) = REPLICATE(CAST('X' AS VARCHAR(MAX)),92681);
SET @y = REPLICATE(@y,92681);
SELECT LEN(@y)
Devoluciones
8589767761
Ejecuté esto en mi máquina de escritorio de 32 bits, por lo que esta cadena de 8 GB excede la memoria direccionable
Corriendo
select internal_objects_alloc_page_count
from sys.dm_db_task_space_usage
WHERE session_id = @@spid
Devuelto
internal_objects_alloc_page_co
2144456
así que supongo que todo esto simplemente se almacena en LOB
páginas tempdb
sin validación de longitud. El crecimiento del recuento de páginas estuvo asociado con la SET @y = REPLICATE(@y,92681);
declaración. La asignación de variable inicial ay @y
el LEN
cálculo no aumentó esto.
La razón para mencionar esto es porque el recuento de páginas es mucho más de lo que esperaba. Suponiendo una página de 8 KB, esto da como resultado 16,36 GB, que obviamente es más o menos el doble de lo que parecería ser necesario. Especulo 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 agregar al final de la cadena existente. Desafortunadamente, por el momento, el .WRITE
método no es compatible con variables varchar (max).
Adición
También probé el comportamiento con concatenación nvarchar(max) + nvarchar(max)
y nvarchar(max) + varchar(max)
. Ambos permiten superar el límite de 2 GB. Intentar almacenar los resultados de esto en una tabla y luego falla, sin embargo, con el mensaje de error Attempting to grow LOB beyond maximum allowed size of 2147483647 bytes.
nuevamente. El script para eso se encuentra a continuación (puede tardar mucho en ejecutarse).
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))
da4294967294
para mí, pero tarda mucho en ejecutarse, incluso después de queSELECT
ha regresado, por lo que no estoy seguro de qué dedica ese tiempo extra.