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

SQL सर्वर:गैर-संख्यात्मक स्ट्रिंग्स पर +(यूनरी) ऑपरेटर

यहाँ इस प्रश्न का मेरा अपना उत्तर है (कृपया अंत में अद्यतन भी देखें):

नहीं, स्ट्रिंग अभिव्यक्तियों पर परिभाषित ऐसा कोई यूनरी ऑपरेटर नहीं है। यह संभव है कि यह एक बग है।

व्याख्या:

दिया गया कथन मान्य है और यह निम्न परिणाम उत्पन्न करता है:

(No column name) 
----------------
ABCDEF
(1 row(s) affected)

जो SELECT . करने के बराबर है + . का उपयोग किए बिना स्टेटमेंट साइन इन करें:

SELECT  'ABCDEF'

बिना किसी त्रुटि के संकलित किया जाना, वास्तव में सफलतापूर्वक निष्पादित किया जाना, यह आभास देता है कि + Unary . के रूप में कार्य कर रहा है दिए गए स्ट्रिंग पर ऑपरेशन। हालाँकि, आधिकारिक T-SQL . में दस्तावेज़ीकरण, ऐसे ऑपरेटर का कोई उल्लेख नहीं है। वास्तव में, "स्ट्रिंग ऑपरेटर्स नामक अनुभाग में ", + दो स्ट्रिंग ऑपरेशंस में दिखाई देता है जो + (String Concatenation) हैं और += (String Concatenation); लेकिन न तो Unary है संचालन। साथ ही, "Unary Operators शीर्षक वाले अनुभाग में ", तीन ऑपरेटरों को पेश किया गया है, उनमें से केवल एक है + (Positive) ऑपरेटर। हालांकि, इसके लिए केवल एक जो प्रासंगिक प्रतीत होता है, यह जल्द ही स्पष्ट हो जाता है कि इस ऑपरेटर का भी गैर-संख्यात्मक स्ट्रिंग मानों से कोई लेना-देना नहीं है, जैसा कि + (Positive) के लिए स्पष्टीकरण है। ऑपरेटर स्पष्ट रूप से बताता है कि यह ऑपरेटर केवल संख्यात्मक मानों के लिए लागू है:"मान लौटाता है एक संख्यात्मक अभिव्यक्ति (एक यूनरी ऑपरेटर) ".

शायद, यह ऑपरेटर उन स्ट्रिंग मानों को सफलतापूर्वक स्वीकार करने के लिए है जिन्हें सफलतापूर्वक संख्याओं के रूप में मूल्यांकन किया गया है जैसे कि यहां उपयोग किया गया है:

SELECT  +'12345'+1

जब उपरोक्त कथन निष्पादित किया जाता है, तो यह आउटपुट में एक संख्या उत्पन्न करता है जो एक संख्या के रूप में मूल्यांकित दिए गए स्ट्रिंग और उसमें जोड़े गए संख्यात्मक मान दोनों का योग होता है, जो कि 1 है। यहाँ लेकिन यह स्पष्ट रूप से कोई अन्य राशि हो सकती है:

(No column name) 
----------------
12346
(1 row(s) affected)

हालांकि, मुझे संदेह है कि यह स्पष्टीकरण सही है क्योंकि यह नीचे दिए गए प्रश्नों को उठाता है:

सबसे पहले, यदि हम स्वीकार करते हैं कि यह स्पष्टीकरण सत्य है, तो हम यह निष्कर्ष निकाल सकते हैं कि अभिव्यक्ति जैसे +'12345' संख्याओं का मूल्यांकन किया जाता है। यदि हां, तो ऐसा क्यों है कि ये संख्याएं स्ट्रिंग से संबंधित कार्यों जैसे DATALENGTH में दिखाई दे सकती हैं , LEN , आदि। आप इस तरह का एक बयान देख सकते हैं:

  SELECT  DATALENGTH(+'12345')

काफी मान्य है और इसके परिणाम निम्न हैं:

 (No column name) 
----------------
5
(1 row(s) affected)

जिसका अर्थ है +'12345' एक स्ट्रिंग के रूप में मूल्यांकन किया जा रहा है संख्या नहीं। इसे कैसे समझाया जा सकता है?

दूसरे, जबकि समान कथन - . के साथ ऑपरेटर, जैसे कि:

 `SELECT  -'ABCDE'` 

या यह भी:

`SELECT  -'12345'` 

नीचे दी गई त्रुटि उत्पन्न करें:

Invalid operator for data type. Operator equals minus, type equals varchar.

क्यों, इसी तरह के मामलों के लिए त्रुटि उत्पन्न नहीं करनी चाहिए जब + ऑपरेटर को गैर-संख्यात्मक स्ट्रिंग मान के साथ गलत तरीके से उपयोग किया गया है?

इसलिए, ये दो प्रश्न मुझे इस स्पष्टीकरण को स्वीकार करने से रोकते हैं कि यह वही है + (unary) ऑपरेटर जो संख्यात्मक मूल्यों के लिए प्रलेखन में पेश किया गया है। जैसा कि इसका कहीं और उल्लेख नहीं है, यह हो सकता है कि इसे जानबूझकर भाषा में जोड़ा गया हो। एक बग हो सकता है।

समस्या तब और गंभीर लगती है जब हम देखते हैं कि इस तरह के बयानों के लिए कोई त्रुटि उत्पन्न नहीं हुई है:

SELECT ++++++++'ABCDE'

मुझे नहीं पता कि क्या कोई अन्य प्रोग्रामिंग भाषा है जो इस तरह के बयानों को स्वीकार करती है। लेकिन अगर वहाँ हैं, तो यह जानना अच्छा होगा कि वे किस उद्देश्य (उद्देश्यों) के लिए + (unary) का उपयोग करते हैं ऑपरेटर एक स्ट्रिंग पर लागू होता है। मैं किसी भी उपयोग की कल्पना नहीं कर सकता!

अपडेट करें

यहाँ यह कहा गया है कि यह पिछले संस्करणों में एक बग रहा है, लेकिन पश्च संगतता के कारण इसे ठीक नहीं किया जाएगा:

कुछ जांच के बाद, यह व्यवहार डिज़ाइन द्वारा है चूंकि + एक यूनरी ऑपरेटर है। तो पार्सर "+ स्वीकार करता है, और इस मामले में '+' को केवल अनदेखा कर दिया जाता है। इस व्यवहार को बदलने से पिछड़े संगतता प्रभाव पड़ते हैं, इसलिए हम इसे बदलने का इरादा नहीं रखते हैं और फिक्स एप्लिकेशन कोड के लिए अनावश्यक परिवर्तन पेश करेगा।




  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 सर्वर 2008 Windows प्रामाणिक लॉगिन त्रुटि:लॉगिन एक अविश्वसनीय डोमेन से है

  2. डीबी में डेटा सहेजें

  3. लेन-देन त्रुटि और लेन-देन के दायरे की स्थिति के लिए कार्रवाई मान्य नहीं है

  4. SSRS में आंतरिक मापदंडों का उपयोग करने के नियम क्या हैं

  5. किसी फ़ील्ड सामग्री में पिछली खाली जगह निकालें