Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL NVARCHAR और VARCHAR सीमाएं

<ब्लॉकक्वॉट>

मैं समझता हूं कि 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 की सीमा को अनिश्चित काल के लिए पार किया जा सकता है (यहां दिखाया गया है)

आपके प्रश्न के अन्य भागों के संबंध में

समायोजन करते समय कटौती डेटा प्रकार पर निर्भर करती है।

  1. varchar(n) + varchar(n) 8,000 वर्णों पर छोटा होगा।
  2. nvarchar(n) + nvarchar(n) 4,000 वर्णों में छोटा होगा।
  3. varchar(n) + nvarchar(n) 4,000 वर्णों में छोटा कर देगा। nvarchar उच्च प्राथमिकता है इसलिए परिणाम nvarchar(4,000) . है
  4. [n]varchar(max) + [n]varchar(max) छोटा नहीं होगा (<2GB के लिए)।
  5. varchar(max) + varchar(n) छोटा नहीं होगा (<2GB के लिए) और परिणाम varchar(max) के रूप में टाइप किया जाएगा ।
  6. varchar(max) + nvarchar(n) छोटा नहीं होगा (<2GB के लिए) और परिणाम nvarchar(max) के रूप में टाइप किया जाएगा ।
  7. 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 बिट &lt; . जैसे वर्णों के साथ समस्याओं से बचा जाता है &lt; . के रूप में दिखाई दे रहा है ।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर में कॉलम नाम या तालिका नाम का नाम कैसे बदलें - SQL सर्वर / टी-एसक्यूएल ट्यूटोरियल भाग 36

  2. SQL सर्वर ट्रिगर - भाग 2 DDL और लॉगऑन ट्रिगर

  3. SQL सर्वर BCP निर्यात दूषित फ़ाइल?

  4. सबक्वेरी में ऑर्डर के साथ एसक्यूएल त्रुटि

  5. SQL त्रुटि:कीवर्ड 'उपयोगकर्ता' के पास गलत सिंटैक्स