Насколько я могу судить, в 2008 году верхнего предела не было.
В SQL Server 2005 код в вашем вопросе не выполняется при назначении @GGMMsg
переменной с помощью
Попытка увеличить LOB сверх максимально допустимого размера в 2 147 483 647 байт.
приведенный ниже код не работает с
REPLICATE: длина результата превышает ограничение длины (2 ГБ) целевого большого типа.
Однако, похоже, эти ограничения были незаметно сняты. 2008 г.
DECLARE @y VARCHAR(MAX) = REPLICATE(CAST('X' AS VARCHAR(MAX)),92681);
SET @y = REPLICATE(@y,92681);
SELECT LEN(@y)
Возврат
8589767761
Я запускал это на своем 32-битном настольном компьютере, поэтому эта строка 8 ГБ намного превышает адресуемую память
Бег
select internal_objects_alloc_page_count
from sys.dm_db_task_space_usage
WHERE session_id = @@spid
Вернулся
internal_objects_alloc_page_co
2144456
поэтому я предполагаю, что все это просто сохраняется на LOB
страницах tempdb
без проверки длины. Рост количества страниц был связан с SET @y = REPLICATE(@y,92681);
заявлением. Первоначальное присвоение переменной @y
и LEN
расчет этого не увеличили.
Причина упоминания этого заключается в том, что количество страниц намного больше, чем я ожидал. Предполагая, что страница размером 8 КБ, получается 16,36 ГБ, что, очевидно, более или менее вдвое больше, чем казалось бы необходимым. Я предполагаю, что это, вероятно, связано с неэффективностью операции конкатенации строк, требующей скопировать всю огромную строку и добавить кусок в конец, а не иметь возможность добавить в конец существующей строки. К сожалению, на данный момент этот .WRITE
метод не поддерживается для переменных varchar (max).
Дополнение
Я также протестировал поведение с объединением nvarchar(max) + nvarchar(max)
и nvarchar(max) + varchar(max)
. Оба из них позволяют превышать ограничение в 2 ГБ. Попытка затем сохранить результаты этого в таблице, но снова терпит неудачу с сообщением об ошибке Attempting to grow LOB beyond maximum allowed size of 2147483647 bytes.
. Сценарий для этого ниже (запуск может занять много времени).
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))
дает4294967294
для меня, но требует много времени для запуска - даже после того,SELECT
как возвращается, поэтому не уверен, на что это дополнительное время тратится.