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