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

SQL सर्वर में LEFT () बनाम SET TEXTSIZE:क्या अंतर है?

आप SET TEXTSIZE . से परिचित हो सकते हैं SQL सर्वर में स्टेटमेंट, जो आपको SELECT . में लौटाए गए डेटा की मात्रा को सीमित करने में सक्षम बनाता है क्वेरी।

शायद आप पा रहे हैं कि इसके परिणाम बिल्कुल LEFT() . के समान हैं एक विशिष्ट क्वेरी चलाते समय। जो प्रश्न पूछता है:क्या इन दो विकल्पों में कोई अंतर है?

इन दोनों विकल्पों में निश्चित रूप से अंतर हैं। ऐसे मामले हैं जहां दोनों कार्य पूरी तरह से अलग परिणाम लौटाएंगे। और उनके काम करने के तरीके के साथ-साथ उस डेटा के प्रकार में भी अंतर होता है जिस पर उनका उपयोग किया जा सकता है।

परिभाषाएं

आइए देखें कि प्रत्येक व्यक्ति क्या करता है।

LEFT()
वर्णों की निर्दिष्ट संख्या के साथ वर्ण स्ट्रिंग का बायां भाग लौटाता है।
SET TEXTSIZE
varchar(max) . का आकार निर्दिष्ट करता है , nvarchar(अधिकतम) , varbinary(अधिकतम) , पाठ , ntext , और छवि SELECT . द्वारा लौटाया गया डेटा बयान।

आइए इसकी विस्तार से जाँच करें।

वर्ण बनाम डेटा आकार

प्रत्येक परिभाषा के शब्दों पर ध्यान दें। विशेष रूप से, शब्द "वर्ण" बनाम "आकार" और "डेटा"।

  • LEFT() आपको स्पष्ट रूप से यह बताने में सक्षम बनाता है कि कितने अक्षर वापस आ गए हैं।
  • SET TEXTSIZE आपको आकार . निर्दिष्ट करने में सक्षम बनाता है लौटाए गए डेटा का।

यह एक महत्वपूर्ण अंतर है, क्योंकि आपको डेटा प्रकार के आधार पर अलग-अलग परिणाम मिलेंगे। अलग-अलग पात्रों को अलग-अलग भंडारण आकार की आवश्यकता हो सकती है। एक वर्ण 1 बाइट का उपयोग कर सकता है और दूसरा 2 बाइट्स का उपयोग कर सकता है।

LEFT() का उपयोग करना आपको वर्णों की संख्या निर्दिष्ट करने की अनुमति देगा, भले ही वे कितने बाइट का उपयोग करें।

SET TEXTSIZE दूसरी ओर, आपको बाइट्स . की संख्या निर्दिष्ट करने की अनुमति देता है लौटने के लिए - नहीं संख्या वर्ण।

यदि डेटा nvarchar(max) . का उपयोग करके संग्रहीत किया जाता है उदाहरण के लिए, आप पा सकते हैं कि SET TEXTSIZE वर्णों की आधी संख्या देता है जो LEFT() करता है।

उदाहरण:

CREATE TABLE TextSizeTest (
    varchar50 varchar(50),
    varcharMax varchar(max),
    nvarcharMax nvarchar(max)
    ); 
INSERT INTO TextSizeTest
VALUES (
    'Dragonfruit',
    'Dragonfruit',
    'Dragonfruit'
    );

SET TEXTSIZE 50;
SELECT 
  LEFT(varchar50, 4) AS varchar50,
  LEFT(varcharMax, 4) AS varcharMax,
  LEFT(nvarcharMax, 4) AS nvarcharMax
FROM TextSizeTest;

SET TEXTSIZE 4;
SELECT * FROM TextSizeTest;

परिणाम:

+-------------+--------------+---------------+
| varchar50   | varcharMax   | nvarcharMax   |
|-------------+--------------+---------------|
| Drag        | Drag         | Drag          |
+-------------+--------------+---------------+
(1 row affected)
Commands completed successfully.
+-------------+--------------+---------------+
| varchar50   | varcharMax   | nvarcharMax   |
|-------------+--------------+---------------|
| Dragonfruit | Drag         | Dr            |
+-------------+--------------+---------------+
(1 row affected)

पहला परिणाम LEFT() . के लिए है . यह सभी तीन डेटा प्रकारों और आकारों में काम करता है। यह निर्दिष्ट वर्णों की सटीक संख्या देता है।

दूसरा परिणाम SET TEXTSIZE . के लिए है . यह varchar(50) . को प्रभावित नहीं करता है परिणाम। यह केवल अन्य दो को प्रभावित करता है। लेकिन यह उन्हें अलग तरह से प्रभावित करता है। वर्कर(अधिकतम) . के लिए , प्रत्येक वर्ण 1 बाइट का उपयोग करता है, और इसलिए हमें निर्दिष्ट TEXTSIZE के समान वर्णों की संख्या मिलती है . nvarchar(अधिकतम) . के लिए यह एक अलग कहानी है। प्रत्येक वर्ण 2 बाइट्स का उपयोग करता है, और इसलिए हमें केवल आधे वर्णों की संख्या वापस मिलती है।

हालांकि, LEFT() by द्वारा दिए गए परिणाम अभी भी संभावित रूप से SET TEXTSIZE . से प्रभावित हो सकता है . अगर मैं LEFT()चलाता हूं फिर से क्वेरी करें, लेकिन इसके पहले SET TEXTSIZE 2 . लिखें , हमें यह मिलता है:

SET TEXTSIZE 2;
SELECT 
  LEFT(varchar50, 4) AS varchar50,
  LEFT(varcharMax, 4) AS varcharMax,
  LEFT(nvarcharMax, 4) AS nvarcharMax
FROM TextSizeTest;
के रूप में चुनें

परिणाम:

+-------------+--------------+---------------+
| varchar50   | varcharMax   | nvarcharMax   |
|-------------+--------------+---------------|
| Drag        | Dr           | D             |
+-------------+--------------+---------------+

अधिकतम डेटा आकार बनाम निश्चित डेटा आकार

एक और अंतर यह है कि SET TEXTSIZE केवल varchar(max) . पर काम करता है , nvarchar(अधिकतम) , varbinary(अधिकतम) , पाठ , ntext , और छवि जानकारी। max नोट करें अंश। यदि आप एक निश्चित डेटा आकार का उपयोग करते हैं (जैसे varchar(255) उदाहरण के लिए), SET TEXTSIZE काम नहीं करेगा।

LEFT() दूसरी ओर, पाठ . को छोड़कर सभी वर्ण डेटा के साथ काम करता है और ntext

आप इन अंतरों को पिछले उदाहरण में देख सकते हैं। वर्चर(50) डेटा LEFT() by से प्रभावित हुआ था लेकिन नहीं SET TEXTSIZE

LEFT() अधिक विशिष्ट है

एक और अंतर यह है कि LEFT() केवल आपके द्वारा निर्दिष्ट कॉलम (या स्थिर या चर) पर लागू होता है। यदि आप इसे एक से अधिक स्तंभों/अभिव्यक्तियों पर लागू करना चाहते हैं, तो आपको प्रत्येक व्यंजक के लिए इसे फिर से शामिल करना होगा। बाद के प्रश्नों के साथ ही।

SET TEXTSIZE दूसरी ओर, क्वेरी में लौटाए गए सभी लागू कॉलमों पर लागू होता है। यह सभी प्रश्नों पर तब तक लागू होता है जब तक कि यह किसी अन्य मान पर सेट न हो जाए।


  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 सर्वर में दिनांक और समय के लिए ODBC स्केलर फ़ंक्शंस (T-SQL उदाहरण)

  2. SQL सर्वर में सबस्ट्रिंग प्राप्त करें

  3. SQL कीवर्ड की तरह दिखने वाले SQL कॉलम नामों से कैसे निपटें?

  4. कैसे एक varchar autoincrement करने के लिए

  5. कई स्तंभों पर DISTINCT की गणना करना