Sejauh yang saya tahu tidak ada batas atas di tahun 2008.
Di SQL Server 2005, kode di pertanyaan Anda gagal pada tugas 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) dari tipe target besar.
Namun tampaknya batasan ini diam-diam telah dicabut. Pada 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 di mesin desktop 32 bit saya sehingga string 8GB ini jauh melebihi memori yang dapat dialamatkan
Lari
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 menganggap ini semua hanya disimpan di LOB
halaman tempdb
tanpa validasi panjangnya. Pertumbuhan jumlah halaman semuanya terkait dengan SET @y = REPLICATE(@y,92681);
pernyataan itu. Penugasan variabel awal @y
dan LEN
penghitungan tidak meningkatkan ini.
Alasan untuk menyebutkan ini adalah karena jumlah halaman jauh lebih banyak dari yang saya harapkan. Dengan asumsi halaman 8KB maka ini bekerja pada 16,36 GB yang jelas lebih atau kurang dua kali lipat dari apa yang tampaknya diperlukan. Saya berspekulasi bahwa ini kemungkinan karena inefisiensi dari operasi penggabungan string yang perlu menyalin seluruh string besar dan menambahkan potongan ke bagian akhir daripada dapat menambahkan ke akhir string yang ada. Sayangnya saat ini .WRITE
metode tersebut tidak didukung untuk variabel varchar (max).
Tambahan
Saya juga telah menguji perilaku tersebut dengan penggabungan nvarchar(max) + nvarchar(max)
dan nvarchar(max) + varchar(max)
. Keduanya memungkinkan terlampaui batas 2GB. Mencoba untuk kemudian menyimpan hasil ini dalam 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)
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))
memberi4294967294
untuk saya tetapi membutuhkan waktu lama untuk menjalankan - bahkan setelahSELECT
telah kembali jadi tidak yakin apa waktu ekstra yang dihabiskan untuk melakukannya.