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, nbu 1 ile 4.000 arasında olmalıdır, ancak kullanılması maxonu büyük bir nesne veri türü olarak tanımlar (yerine geçmesi ntextkullanı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. nvarchardaha 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 @Akarşılaştı kesme.
Yaşadığınız sorunu nasıl çözebilirsiniz.
Ya iki maxveri türünü birbirine bağladığınız için ya da bir varchar(4001 - 8000)dizeyi nvarcharyazı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, XMLsonuçlar için sınırsız uzunluk ayarlamanıza izin verir . processing-instructionBiraz gibi karakterlerle ilgili sorunları önler <olarak gösterilmesini <.