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
Đang cố gắng tăng LOB vượt quá kích thước tối đa cho phép là 2.147.483.647 byte.
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)
Lợi nhuận
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ớ đị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 tempdb
mà không có xác nhận về độ dài. Tất cả sự tăng trưởng về số lượng trang đều được kết hợp với SET @y = REPLICATE(@y,92681);
tuyên bố. Việc gán biến ban đầu cho @y
và LEN
phép tính 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 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ự kém hiệu quả của hoạt động nối chuỗi 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 này không được hỗ trợ cho các biến varchar (max).
Thêm vào
Tôi cũng đã thử nghiệm hành vi với nối 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 nhưng 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.
một 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
declare @x varchar(max) = 'XX'; SELECT LEN(REPLICATE(@x,2147483647))
mang lại4294967294
cho tôi nhưng mất nhiều thời gian để chạy - ngay cả sau khiSELECT
đã quay trở lại, vì vậy không chắc chắn rằng thời gian thêm đó được dành để làm gì.