Theo như tôi có thể nói thì không có giới hạn trên trong năm 2008.
Trong SQL Server 2005, mã trong câu hỏi của bạn không thành công khi gán cho @GGMMsg
biến với
Cố gắng tăng LOB vượt quá kích thước tối đa cho phép là 2.147.483.647byte.
mã bên dưới không thành công với
REPLICATE:Độ dài của kết quả vượt quá giới hạn độ dài (2GB) của loại lớn mục tiêu.
Tuy nhiên, có vẻ như những hạn chế này đã lặng lẽ được dỡ bỏ. Vào năm 2008
DECLARE @y VARCHAR(MAX) = REPLICATE(CAST('X' AS VARCHAR(MAX)),92681);
SET @y = REPLICATE(@y,92681);
SELECT LEN(@y)
Trả lại
8589767761
Tôi đã chạy điều này trên máy tính để bàn 32 bit của mình nên chuỗi 8GB này vượt quá bộ nhớ có thể định địa chỉ
Đang 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 cho rằng tất cả điều này chỉ được lưu trữ trong LOB
các trang trong tempdb
không có xác nhận về độ dài. Tăng số lượng trang đều được liên kết với SET @y = REPLICATE(@y,92681);
tuyên bố. Phép gán biến ban đầu cho @y
và LEN
tính toán đã không làm tăng điều này.
Lý do đề cập đến điều này là vì số lượng trang nhiều hơn tôi mong đợi. Giả sử một trang 8KB thì điều này hoạt động ở 16,36 GB, rõ ràng là nhiều hơn hoặc ít hơn gấp đôi so vớ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 hoạt động nối chuỗi không hiệu quả, cần 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ó. Rất tiếc tại thời điểm này, .WRITE
phương thức không được hỗ trợ cho các biến varchar (max).
Bổ sung
Tôi cũng đã kiểm tra hành vi với việc nối nvarchar(max) + nvarchar(max)
và nvarchar(max) + varchar(max)
. Cả hai điều này đều cho phép vượt quá giới hạn 2GB. Tuy nhiên, cố gắng lưu trữ kết quả của điều này trong một bảng thì không thành công với thông báo lỗi Attempting to grow LOB beyond maximum allowed size of 2147483647 bytes.
lần nữa. Tập lệnh cho điều đó ở bên dưới (có thể mất nhiều thời gian để 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