Maksimum 4000 ayar olduğunu anlıyorum NVARCHAR(MAX)
Anlayışınız yanlış. nvarchar(max)
2 GB'a kadar (bazen daha fazla) veri (1 milyar çift bayt karakter) depolayabilir.
Gönderen nchar ve nvarchar Books online gramer olduğu
nvarchar [ ( n | max ) ]
|
Karakter araçlarının bu alternatiflerdir. yani ya n
ya da değişmezi belirtirsiniz max
.
Spesifik bir belirlemeyi seçerseniz, n
bu 1 ile 4.000 arasında olmalıdır, ancak kullanılması max
onu büyük bir nesne veri türü olarak tanımlar (yerine geçmesi ntext
kullanımdan kaldırılmıştır).
Aslında SQL Server 2008'de bir değişken için 2GB sınırının süresiz olarak aşılabileceği ve tempdb
( Burada gösterilmektedir )
Sorunuzun diğer kısımlarıyla ilgili olarak
Birleştirme sırasındaki kesme, veri türüne bağlıdır.
varchar(n) + varchar(n)
8.000 karakterde kesilecek.
nvarchar(n) + nvarchar(n)
4.000 karakterde kesilecek.
varchar(n) + nvarchar(n)
4.000 karakterde kesilecek. nvarchar
daha yüksek önceliğe sahiptir, bu nedenle sonuçnvarchar(4,000)
[n]varchar(max)
+ [n]varchar(max)
kesilmeyecek (<2GB için).
varchar(max)
+ varchar(n)
kesilmeyecek (<2GB için) ve sonuç olarak yazılacaktır varchar(max)
.
varchar(max)
+ nvarchar(n)
kesilmeyecek (<2GB için) ve sonuç olarak yazılacaktır nvarchar(max)
.
nvarchar(max)
+ varchar(n)
, önce varchar(n)
girdiyi dönüştürür nvarchar(n)
ve sonra birleştirmeyi yapar. Dizenin uzunluğu varchar(n)
4.000 karakterden fazlaysa, atama yapılır nvarchar(4000)
ve kesme gerçekleşir .
Dize değişmezlerinin veri türleri
N
Öneki kullanırsanız ve dize <= 4.000 karakter uzunluğundaysa, dizenin uzunluğu nvarchar(n)
nereye yazılır n
. Yani örneğin N'Foo'
olarak ele alınacaktır nvarchar(3)
. Dize 4.000 karakterden uzunsa, şu şekilde değerlendirilecektir:nvarchar(max)
N
Öneki kullanmazsanız ve dize <= 8.000 karakter uzunluğundaysa, dizenin uzunluğu varchar(n)
nereye yazılır n
. Kadar uzunsavarchar(max)
Yukarıdakilerin her ikisi için, dizenin uzunluğu sıfırsa n
, 1'e ayarlanır.
Daha yeni sözdizimi öğeleri.
1.CONCAT
buradaki görevi yardımcı olmuyor
DECLARE @A5000 VARCHAR(5000) = REPLICATE('A',5000);
SELECT DATALENGTH(@A5000 + @A5000),
DATALENGTH(CONCAT(@A5000,@A5000));
Yukarıdaki, her iki birleştirme yöntemi için 8000 döndürür.
2. Dikkatli olun+=
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);`
İadeler
-------------------- --------------------
8000 10000
Not @A
karşılaştı kesme.
Yaşadığınız sorunu nasıl çözebilirsiniz.
Ya iki max
veri türünü birbirine bağladığınız için ya da bir varchar(4001 - 8000)
dizeyi nvarchar
yazılan bir dizeye (çift nvarchar(max)
) birleştirdiğiniz için kesilme alıyorsunuz .
İkinci sorunu önlemek için, tüm dizgi değişmezlerinin (veya en azından 4001 - 8000 aralığında uzunluklara sahip olanların) önünde olduğundan emin olun N
.
İlk sorunu önlemek için atamayı
DECLARE @SQL NVARCHAR(MAX);
SET @SQL = 'Foo' + 'Bar' + ...;
İçin
DECLARE @SQL NVARCHAR(MAX) = '';
SET @SQL = @SQL + N'Foo' + N'Bar'
böylece bir NVARCHAR(MAX)
birleştirmeye baştan dahil edilir (her birleştirme sonucunda NVARCHAR(MAX)
bu da yayılır)
Görüntülerken kesilmekten kaçınmak
"Kılavuza göre sonuçlar" modunun seçili olduğundan emin olun, ardından kullanabilirsiniz
select @SQL as [processing-instruction(x)] FOR XML PATH
SSMS seçenekleri, XML
sonuçlar için sınırsız uzunluk ayarlamanıza izin verir . processing-instruction
Biraz gibi karakterlerle ilgili sorunları önler <
olarak gösterilmesini <
.