Theo như tôi có thể nói không có giới hạn trên trong năm 2008.
Trong SQL Server 2005 các mã trong câu hỏi của bạn không thành công trên sự phân công vào biến @GGMMsg
với
Cố để tăng LOB vượt quá kích thước tối đa cho phép là 2,147,483,647 byte.
mã dưới đây không thành công với
tái tạo: Chiều dài của kết quả vượt quá giới hạn độ dài (2GB) của mục tiêu loại lớn.
Tuy nhiên, dường như những giới hạn này đã được dỡ bỏ một cách lặng lẽ.Trên 2008
DECLARE @y VARCHAR(MAX) = REPLICATE(CAST('X' AS VARCHAR(MAX)),92681);
SET @y = REPLICATE(@y,92681);
SELECT LEN(@y)
Returns
8589767761
Tôi chạy này trên máy tính để bàn 32 bit của tôi vì vậy chuỗi 8GB đây là cách vượt quá bộ nhớ địa chỉ
Chạy
select internal_objects_alloc_page_count
from sys.dm_db_task_space_usage
WHERE session_id = @@spid
trả lại
internal_objects_alloc_page_co
------------------------------
2144456
vì vậy tôi đoán tất cả điều này chỉ được lưu trữ trong LOB
trang trong tempdb
không có xác thực về độ dài. Tăng trưởng số lượng trang được liên kết với câu lệnh SET @y = REPLICATE(@y,92681);
. Việc gán biến ban đầu cho @y
và tính toán LEN
không làm tăng điều này.
Lý do để đề cập đến điều này là do số lượng trang nhiều hơn tôi mong đợi. Giả sử một trang 8KB sau đó điều này làm việc tại 16,36 GB mà rõ ràng là nhiều hơn hoặc ít hơn gấp đôi những gì có vẻ là cần thiết. Tôi suy đoán rằng điều này có thể là do sự thiếu hiệu quả của hoạt động nối chuỗi cần phải sao chép toàn bộ chuỗi lớn và nối một đoạn vào cuối thay vì có thể thêm vào cuối chuỗi hiện có. Thật không may tại thời điểm .WRITE
phương pháp isn't supported cho biến varchar (max).
Addition
Tôi cũng đã thử nghiệm hành vi với concatenating nvarchar(max) + nvarchar(max)
và nvarchar(max) + varchar(max)
. Cả hai đều cho phép vượt quá giới hạn 2GB. Sau đó cố gắng lưu trữ kết quả của điều này trong một bảng sau đó thất bại với thông báo lỗi Attempting to grow LOB beyond maximum allowed size of 2147483647 bytes.
một lần nữa. Các kịch bản cho rằng là dưới đây (có thể mất một thời gian dài để chạy).
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)) 'cung cấp cho '4294967294' cho tôi nhưng phải mất một thời gian dài để chạy - ngay cả sau khi' SELECT' đã quay trở lại để không chắc chắn những gì thêm thời gian được chi tiêu làm. –