Saya memahami bahwa ada set maks 4000 untuk NVARCHAR(MAX)
Pemahaman Anda salah. nvarchar(max)dapat menyimpan hingga (dan terkadang lebih dari itu) 2GB data (1 miliar karakter byte ganda).
Dari nchar dan nvarchar di Buku online tata bahasanya adalah
nvarchar [ ( n | max ) ]
The |karakter cara ini alternatif. yaitu Anda menentukan salah satu n atau literal max.
Jika Anda memilih untuk menentukan spesifik nmaka ini harus antara 1 dan 4.000 tetapi menggunakan maxmendefinisikannya sebagai tipe data objek besar (penggantinya ntexttidak digunakan lagi).
Faktanya di SQL Server 2008 tampaknya untuk variabel batas 2GB dapat dilampaui tanpa batas waktu tergantung pada ruang yang cukup di tempdb( Ditunjukkan di sini )
Mengenai bagian lain dari pertanyaan Anda
Pemotongan saat penggabungan bergantung pada tipe data.
varchar(n) + varchar(n) akan dipotong menjadi 8.000 karakter.
nvarchar(n) + nvarchar(n) akan dipotong menjadi 4.000 karakter.
varchar(n) + nvarchar(n)akan dipotong menjadi 4.000 karakter. nvarcharmemiliki prioritas yang lebih tinggi sehingga hasilnya adalahnvarchar(4,000)
[n]varchar(max)+ [n]varchar(max)tidak akan dipotong (untuk <2GB).
varchar(max)+ varchar(n)tidak akan dipotong (untuk <2GB) dan hasilnya akan diketik sebagai varchar(max).
varchar(max)+ nvarchar(n)tidak akan dipotong (untuk <2GB) dan hasilnya akan diketik sebagai nvarchar(max).
nvarchar(max)+ varchar(n)pertama-tama akan mengubah varchar(n)input menjadi nvarchar(n)dan kemudian melakukan penggabungan. Jika panjang varchar(n)string lebih dari 4.000 karakter maka cast akan menjadi nvarchar(4000)dan pemotongan akan terjadi .
Jenis data literal string
Jika menggunakan Nawalan dan panjang string <= 4.000 karakter maka akan diketik nvarchar(n)dimana npanjang stringnya. Jadi N'Foo'akan diperlakukan sebagai nvarchar(3)contoh. Jika string lebih dari 4.000 karakter itu akan diperlakukan sebagainvarchar(max)
Jika Anda tidak menggunakan Nawalan dan panjang string <= 8.000 karakter maka akan diketik varchar(n)dimana npanjang stringnya. Jika lebih lamavarchar(max)
Untuk kedua hal di atas jika panjang string adalah nol maka ndiset ke 1.
Elemen sintaks yang lebih baru.
1. The CONCATFungsi tidak membantu di sini
DECLARE @A5000 VARCHAR(5000) = REPLICATE('A',5000);
SELECT DATALENGTH(@A5000 + @A5000),
DATALENGTH(CONCAT(@A5000,@A5000));
Di atas mengembalikan 8000 untuk kedua metode penggabungan.
2. Hati-hati dengan+=
DECLARE @A VARCHAR(MAX) = '';
SET @A+= REPLICATE('A',5000) + REPLICATE('A',5000)
DECLARE @B VARCHAR(MAX) = '';
SET @B = @B + REPLICATE('A',5000) + REPLICATE('A',5000)
SELECT DATALENGTH(@A),
DATALENGTH(@B);`
Kembali
-------------------- --------------------
8000 10000
Perhatikan bahwa @Amengalami pemotongan.
Cara mengatasi masalah yang Anda alami.
Anda mendapatkan pemotongan baik karena Anda menggabungkan dua maxtipe data non bersama-sama atau karena Anda menggabungkan varchar(4001 - 8000)string ke string yang nvarchardiketik (genap nvarchar(max)).
Untuk menghindari masalah kedua cukup pastikan bahwa semua literal string (atau setidaknya yang memiliki panjang dalam kisaran 4001 - 8000) diawali dengan N.
Untuk menghindari masalah pertama, ubah tugas dari
DECLARE @SQL NVARCHAR(MAX);
SET @SQL = 'Foo' + 'Bar' + ...;
Untuk
DECLARE @SQL NVARCHAR(MAX) = '';
SET @SQL = @SQL + N'Foo' + N'Bar'
sehingga sebuah NVARCHAR(MAX)terlibat dalam penggabungan dari awal (sebagai hasil dari setiap penggabungan juga NVARCHAR(MAX)akan menyebar)
Menghindari pemotongan saat melihat
Pastikan Anda memilih mode "hasil ke kisi", lalu Anda dapat menggunakan
select @SQL as [processing-instruction(x)] FOR XML PATH
Opsi SSMS memungkinkan Anda menyetel panjang tak terbatas untuk XMLhasil. The processing-instructionbit menghindari masalah dengan karakter seperti <muncul sebagai <.