Sejauh yang saya tahu tidak ada batas atas pada tahun 2008.
Di SQL Server 2005 kode dalam pertanyaan Anda gagal pada penugasan ke @GGMMsg
variabel dengan
Mencoba menumbuhkan LOB melebihi ukuran maksimum yang diizinkan yaitu 2.147.483.647 byte.
kode di bawah ini gagal dengan
REPLICATE:Panjang hasil melebihi batas panjang (2GB) target tipe besar.
Namun tampaknya batasan ini diam-diam telah dicabut. Pada tahun 2008
DECLARE @y VARCHAR(MAX) = REPLICATE(CAST('X' AS VARCHAR(MAX)),92681);
SET @y = REPLICATE(@y,92681);
SELECT LEN(@y)
Kembali
8589767761
Saya menjalankan ini pada mesin desktop 32 bit saya sehingga string 8GB ini jauh melebihi memori yang dapat dialamatkan
Menjalankan
select internal_objects_alloc_page_count
from sys.dm_db_task_space_usage
WHERE session_id = @@spid
Dikembalikan
internal_objects_alloc_page_co
------------------------------
2144456
jadi saya kira ini semua hanya disimpan di LOB
halaman dalam tempdb
tanpa validasi panjangnya. Pertumbuhan jumlah halaman semuanya terkait dengan SET @y = REPLICATE(@y,92681);
penyataan. Penetapan variabel awal ke @y
dan LEN
perhitungan tidak meningkatkan ini.
Alasan untuk menyebutkan ini adalah karena jumlah halaman jauh lebih banyak dari yang saya harapkan. Dengan asumsi halaman 8KB maka ini berfungsi pada 16,36 GB yang jelas kurang lebih dua kali lipat dari apa yang tampaknya diperlukan. Saya berspekulasi bahwa ini mungkin karena ketidakefisienan operasi penggabungan string yang perlu menyalin seluruh string besar dan menambahkan potongan ke akhir daripada dapat menambahkan ke akhir string yang ada. Sayangnya saat ini .WRITE
metode tidak didukung untuk variabel varchar(max).
Penambahan
Saya juga telah menguji perilaku dengan menggabungkan nvarchar(max) + nvarchar(max)
dan nvarchar(max) + varchar(max)
. Keduanya memungkinkan batas 2GB terlampaui. Mencoba untuk kemudian menyimpan hasil ini dalam sebuah tabel kemudian gagal namun dengan pesan kesalahan Attempting to grow LOB beyond maximum allowed size of 2147483647 bytes.
lagi. Script untuk itu ada di bawah (mungkin butuh waktu lama untuk dijalankan).
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