Tanto quanto posso dizer, não há limite máximo em 2008.
No SQL Server 2005, o código em sua pergunta falha na atribuição à @GGMMsgvariável com
Tentativa de aumentar o LOB além do tamanho máximo permitido de 2.147.483.647 bytes.
o código abaixo falha com
REPLICATE: O comprimento do resultado excede o limite de comprimento (2 GB) do tipo grande de destino.
No entanto, parece que essas limitações foram discretamente levantadas. Em 2008
DECLARE @y VARCHAR(MAX) = REPLICATE(CAST('X' AS VARCHAR(MAX)),92681);
SET @y = REPLICATE(@y,92681);
SELECT LEN(@y)
Devoluções
8589767761
Eu executei isso na minha máquina de desktop de 32 bits, então essa string de 8 GB é muito mais do que memória endereçável
Corrida
select internal_objects_alloc_page_count
from sys.dm_db_task_space_usage
WHERE session_id = @@spid
Retornou
internal_objects_alloc_page_co
------------------------------
2144456
então presumo que tudo isso seja armazenado em LOBpáginas tempdbsem validação de comprimento. O crescimento da contagem de páginas estava associado à SET @y = REPLICATE(@y,92681);declaração. A atribuição inicial da variável @ye o LENcálculo não aumentaram isso.
A razão para mencionar isso é porque a contagem de páginas é muito maior do que eu esperava. Supondo uma página de 8 KB, isso resulta em 16,36 GB, o que é obviamente mais ou menos o dobro do que seria necessário. Eu especulo que isso provavelmente se deve à ineficiência da operação de concatenação de string, que precisa copiar toda a string enorme e anexar um pedaço ao final, em vez de ser capaz de adicionar ao final da string existente. Infelizmente, no momento, o .WRITEmétodo não é compatível com variáveis varchar (max).
Adição
Também testei o comportamento com concatenação nvarchar(max) + nvarchar(max)e nvarchar(max) + varchar(max). Ambos permitem que o limite de 2 GB seja excedido. A tentativa de armazenar os resultados disso em uma tabela falha, porém com a mensagem de erro Attempting to grow LOB beyond maximum allowed size of 2147483647 bytes.novamente. O script para isso está abaixo (pode levar muito tempo para ser executado).
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))dá4294967294para mim, mas leva muito tempo para ser executado - mesmo depois que oSELECTvoltou, não tenho certeza do que esse tempo extra é gasto fazendo.