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 n
maka ini harus antara 1 dan 4.000 tetapi menggunakan max
mendefinisikannya sebagai tipe data objek besar (penggantinya ntext
tidak 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. nvarchar
memiliki 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 N
awalan dan panjang string <= 4.000 karakter maka akan diketik nvarchar(n)
dimana n
panjang 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 N
awalan dan panjang string <= 8.000 karakter maka akan diketik varchar(n)
dimana n
panjang stringnya. Jika lebih lamavarchar(max)
Untuk kedua hal di atas jika panjang string adalah nol maka n
diset ke 1.
Elemen sintaks yang lebih baru.
1. The 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 max
tipe data non bersama-sama atau karena Anda menggabungkan varchar(4001 - 8000)
string ke string yang nvarchar
diketik (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 XML
hasil. The processing-instruction
bit menghindari masalah dengan karakter seperti <
muncul sebagai <
.