Saya mengerti bahwa ada set maksimum 4000 untuk
NVARCHAR(MAX)
Pemahaman Anda salah. nvarchar(max)
dapat menyimpan hingga (dan terkadang lebih) data 2 GB (1 miliar karakter bita ganda).
Dari nchar dan nvarchar di Buku online tata bahasanya adalah
nvarchar [ ( n | max ) ]
|
karakter berarti ini adalah alternatif. yaitu Anda menentukan salah satu n
atau max
literal .
Jika Anda memilih untuk menentukan n
. tertentu maka ini harus antara 1 dan 4,000 tetapi menggunakan max
mendefinisikannya sebagai tipe data objek besar (pengganti ntext
yang tidak digunakan lagi).
Sebenarnya di SQL Server 2008 tampaknya untuk variabel batas 2GB dapat dilampaui tanpa batas dengan ruang yang cukup di tempdb
(Tampil di sini)
Mengenai bagian lain dari pertanyaan Anda
Pemotongan saat menggabungkan 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 terpotong pada 4.000 karakter.nvarchar
memiliki prioritas lebih tinggi sehingga hasilnya adalahnvarchar(4,000)
[n]varchar(max)
+[n]varchar(max)
tidak akan terpotong (untuk <2 GB).varchar(max)
+varchar(n)
tidak akan terpotong (untuk <2GB) dan hasilnya akan diketik sebagaivarchar(max)
.varchar(max)
+nvarchar(n)
tidak akan terpotong (untuk <2GB) dan hasilnya akan diketik sebagainvarchar(max)
.nvarchar(max)
+varchar(n)
pertama-tama akan mengonversivarchar(n)
masukan kenvarchar(n)
dan kemudian melakukan penggabungan. Jika panjangvarchar(n)
string lebih besar dari 4.000 karakter, pemerannya akan menjadinvarchar(4000)
dan pemotongan akan terjadi .
Tipe data string literal
Jika Anda menggunakan N
awalan dan string <=4,000 karakter akan diketik sebagai nvarchar(n)
dimana n
adalah panjang tali. Jadi N'Foo'
akan diperlakukan sebagai nvarchar(3)
Misalnya. Jika string lebih panjang dari 4.000 karakter, itu akan diperlakukan sebagai nvarchar(max)
Jika Anda tidak menggunakan N
awalan dan string <=8.000 karakter akan diketik sebagai varchar(n)
dimana n
adalah panjang tali. Jika lebih panjang sebagai varchar(max)
Untuk kedua hal di atas jika panjang string adalah nol maka n
disetel ke 1.
Elemen sintaks yang lebih baru.
1. CONCAT
fungsi 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 @A
mengalami pemotongan.
Cara mengatasi masalah yang Anda alami.
Anda mendapatkan pemotongan baik karena Anda menggabungkan dua non max
tipe data bersama-sama atau karena Anda menggabungkan varchar(4001 - 8000)
string ke nvarchar
string yang diketik (bahkan nvarchar(max)
).
Untuk menghindari masalah kedua, cukup pastikan bahwa semua literal string (atau setidaknya yang memiliki panjang dalam rentang 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 NVARCHAR(MAX)
terlibat dalam rangkaian dari awal (sebagai hasil dari setiap rangkaian juga akan menjadi NVARCHAR(MAX)
ini akan menyebar)
Menghindari pemotongan saat melihat
Pastikan Anda telah memilih mode "hasil ke kisi" agar Anda dapat menggunakan
select @SQL as [processing-instruction(x)] FOR XML PATH
Opsi SSMS memungkinkan Anda menyetel panjang tak terbatas untuk XML
hasil. processing-instruction
bit menghindari masalah dengan karakter seperti <
muncul sebagai <
.