मैं समझता हूं कि इसके लिए 4000 अधिकतम सेट है NVARCHAR(MAX)
आपकी समझ गलत है। nvarchar(max)स्टोर कर सकते हैं (और कभी-कभी परे) 2GB डेटा (1 बिलियन डबल बाइट वर्ण)।
से nchar और nvarchar में पुस्तकें ऑनलाइन व्याकरण है
nvarchar [ ( n | max ) ]
|चरित्र का मतलब है इन विकल्प हैं। यानी आप या तो शाब्दिक रूप से निर्दिष्ट करते हैं ।nmax
यदि आप एक विशिष्ट निर्दिष्ट करने के लिए चुनते हैं nतो यह 1 और 4,000 के बीच होना चाहिए, लेकिन maxइसे एक बड़े ऑब्जेक्ट डेटाटाइप ( ntextजिसके लिए पदावनत किया गया है) के रूप में परिभाषित करता है ।
वास्तव में SQL Server 2008 में ऐसा लगता है कि एक चर के लिए 2GB की सीमा अनिश्चित काल के लिए पर्याप्त हो सकती है tempdb( यहाँ दिखाया गया है )
आपके प्रश्न के अन्य भागों के बारे में
जब संघनन डेटटाइप पर निर्भर करता है तो ट्रंकेशन।
varchar(n) + varchar(n) 8,000 पात्रों पर छंटनी करेगा।
nvarchar(n) + nvarchar(n) 4,000 पात्रों पर छंटनी करेगा।
varchar(n) + nvarchar(n)4,000 पात्रों पर छंटनी करेगा। nvarcharइसका परिणाम अधिक हैnvarchar(4,000)
[n]varchar(max)+ [n]varchar(max)छोटा नहीं होगा (<2GB के लिए)।
varchar(max)+ varchar(n)छोटा नहीं होगा (<2GB के लिए) और परिणाम को टाइप किया जाएगा varchar(max)।
varchar(max)+ nvarchar(n)छोटा नहीं होगा (<2GB के लिए) और परिणाम को टाइप किया जाएगा nvarchar(max)।
nvarchar(max)+ varchar(n)सबसे पहले varchar(n)इनपुट को रूपांतरित करेगा nvarchar(n)और फिर संघनन करेगा। यदि varchar(n)स्ट्रिंग की लंबाई 4,000 वर्णों से अधिक है, तो कलाकारों को हो जाएगा nvarchar(4000)और छंटनी होगी ।
स्ट्रिंग शाब्दिक के डेटाटिप्स
यदि आप Nउपसर्ग का उपयोग करते हैं और स्ट्रिंग <= 4,000 वर्ण लंबा है तो इसे टाइप किया जाएगा nvarchar(n)जहां nस्ट्रिंग की लंबाई है। तो उदाहरण के लिए N'Foo'इलाज किया जाएगा nvarchar(3)। यदि स्ट्रिंग 4,000 वर्णों से अधिक लंबी है तो इसे माना जाएगाnvarchar(max)
यदि आप Nउपसर्ग का उपयोग नहीं करते हैं और स्ट्रिंग <= 8,000 वर्ण लंबा है तो इसे टाइप किया जाएगा varchar(n)जहां nस्ट्रिंग की लंबाई है। अगर लंबे समय के रूप मेंvarchar(max)
उपरोक्त दोनों के लिए यदि स्ट्रिंग की लंबाई शून्य है तो n1 पर सेट किया जाता है।
नए वाक्यविन्यास तत्व।
1.CONCAT समारोह यहाँ मदद नहीं करता है
DECLARE @A5000 VARCHAR(5000) = REPLICATE('A',5000);
SELECT DATALENGTH(@A5000 + @A5000),
DATALENGTH(CONCAT(@A5000,@A5000));
उपर्युक्त तरीकों के दोनों तरीकों के लिए उपरोक्त रिटर्न 8000 है।
2. सावधानी बरतें+=
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);`
रिटर्न
-------------------- --------------------
8000 10000
ध्यान दें कि @Aट्रंकेशन का सामना करना पड़ा।
आप जिस समस्या का सामना कर रहे हैं, उसे कैसे हल करें।
आपको ट्रेंक्यूशन हो रहा है क्योंकि आप maxएक साथ दो गैर डेटाैटिप्स को समेट रहे हैं या क्योंकि आप एक varchar(4001 - 8000)स्ट्रिंग को nvarcharटाइप किए गए स्ट्रिंग (यहां तक कि nvarchar(max)) के लिए संक्षिप्त कर रहे हैं ।
दूसरे मुद्दे से बचने के लिए बस सुनिश्चित करें कि सभी स्ट्रिंग शाब्दिक (या कम से कम 4001 - 8000 रेंज में लंबाई वाले) पूर्वनिर्धारित हैं N।
पहले मुद्दे से बचने के लिए असाइनमेंट को बदलें
DECLARE @SQL NVARCHAR(MAX);
SET @SQL = 'Foo' + 'Bar' + ...;
सेवा
DECLARE @SQL NVARCHAR(MAX) = '';
SET @SQL = @SQL + N'Foo' + N'Bar'
ताकि एक NVARCHAR(MAX)शुरू से ही संघ में शामिल हो (प्रत्येक सहमति का परिणाम भी NVARCHAR(MAX)यही होगा)
देखने पर छंटनी से बचना
सुनिश्चित करें कि आपके पास "ग्रिड टू रिजल्ट" मोड चयनित है तो आप उपयोग कर सकते हैं
select @SQL as [processing-instruction(x)] FOR XML PATH
SSMS विकल्प आपको XMLपरिणामों के लिए असीमित लंबाई निर्धारित करने की अनुमति देते हैं । processing-instructionबिट जैसे पात्रों के साथ मुद्दों से बचा जाता <के रूप में दिखने <।