मैं समझता हूं कि इसके लिए 4000 अधिकतम सेट है NVARCHAR(MAX)
आपकी समझ गलत है। nvarchar(max)
स्टोर कर सकते हैं (और कभी-कभी परे) 2GB डेटा (1 बिलियन डबल बाइट वर्ण)।
से nchar और nvarchar में पुस्तकें ऑनलाइन व्याकरण है
nvarchar [ ( n | max ) ]
|
चरित्र का मतलब है इन विकल्प हैं। यानी आप या तो शाब्दिक रूप से निर्दिष्ट करते हैं ।n
max
यदि आप एक विशिष्ट निर्दिष्ट करने के लिए चुनते हैं 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)
उपरोक्त दोनों के लिए यदि स्ट्रिंग की लंबाई शून्य है तो n
1 पर सेट किया जाता है।
नए वाक्यविन्यास तत्व।
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
बिट जैसे पात्रों के साथ मुद्दों से बचा जाता <
के रूप में दिखने <
।