क्या SQL सर्वर एक सिस्टम प्रक्रिया के लिए पारित स्ट्रिंग के लिए एक वस्तु नाम का व्यापार करने की अनुमति देता है


13

सिस्टम संग्रहीत कार्यविधि के लिए ऑब्जेक्ट नाम को पारित करने के लिए कानूनी होने का क्या कारण है sp_helptext?

क्या तंत्र ऑब्जेक्ट नाम को स्ट्रिंग में परिवर्तित करता है?

जैसे

-- works
sp_helptext myproc
sp_helptext [myproc]
sp_helptext [dbo.myproc]
-- and behaves the same as a string
sp_helptext 'myproc'
sp_helptext 'dbo.myproc'

-- does not work
sp_helptext dbo.myproc -- Msg 102, Level 15, State 1, Line 1 incorrect syntax near '.'
-- an additional case that does not work.
sp_helptext [dbo].[myproc] -- Msg 102, Level 15, State 1, Line 1 incorrect syntax

यह अजीब लगता है कि मुझे एकल उद्धरण मान्य नामों की आवश्यकता नहीं है , जब तक कि इसमें .अलग स्कीमा नाम और प्रक्रिया का नाम न हो। मैं एक स्पष्टीकरण की तलाश कर रहा हूं कि यह पैरामीटर के मान के रूप में पारित होने के लिए एक उद्धृत नाम से स्ट्रिंग स्ट्रिंग में परिवर्तित ऑटो कैसे हो जाता है।

मेरे पास हल करने के लिए एक विशिष्ट मुद्दा नहीं है; मैं केवल उन चीजों के बारे में जिज्ञासु हूं जो दस्तावेज नहीं हैं।


टिप्पणियों में योगदान इस चैट रूम में ले जाया गया है ।
पॉल व्हाइट 9

जवाबों:


10

सिस्टम संग्रहीत कार्यविधि के लिए पहला तर्क sp_helptextहै:

[@objname= ] 'name'
उपयोगकर्ता-परिभाषित, स्कीमा-स्कॉप्ड ऑब्जेक्ट का योग्य या अयोग्य नाम है। एक योग्य वस्तु निर्दिष्ट होने पर ही उद्धरण चिह्नों की आवश्यकता होती है। यदि डेटाबेस नाम सहित एक पूरी तरह से योग्य नाम प्रदान किया जाता है, तो डेटाबेस नाम वर्तमान डेटाबेस का नाम होना चाहिए। वर्तमान डेटाबेस में ऑब्जेक्ट होना चाहिए। नाम है nvarchar(776), बिना किसी डिफ़ॉल्ट के।

इसके अलावा, डेलिफ़ाइड आइडेंटिफ़ायर (डेटाबेस इंजन) के लिए दस्तावेज बताता है:

SQL सर्वर में पैरामीटर के रूप में पहचानकर्ता का उपयोग करना
कई सिस्टम संग्रहीत कार्यविधियाँ, फ़ंक्शन और DBCC कथन पैरामीटर के रूप में ऑब्जेक्ट नाम लेते हैं। इनमें से कुछ पैरामीटर ऑब्जेक्ट ऑब्जेक्ट नामों को स्वीकार करते हैं, जबकि अन्य केवल एकल-भाग नामों को स्वीकार करते हैं। एकल-भाग या मल्टीपार्ट नाम अपेक्षित है या नहीं यह निर्धारित करता है कि SQL सर्वर द्वारा पैरामीटर को पार्स और आंतरिक रूप से कैसे उपयोग किया जाता है।

एकल-भाग पैरामीटर नाम
यदि पैरामीटर एकल-भाग पहचानकर्ता है, तो नाम निम्नलिखित तरीकों से निर्दिष्ट किया जा सकता है:

  • उद्धरण चिह्नों या सीमांकक के बिना
  • एकल उद्धरण चिह्नों में संलग्न
  • दोहरे उद्धरण चिह्नों में संलग्न है
  • कोष्ठक में संलग्न

मल्टीपार्ट पैरामीटर नाम
मल्टीपार्ट नाम योग्य नाम हैं जिनमें डेटाबेस या स्कीमा नाम और ऑब्जेक्ट नाम भी शामिल हैं। जब एक मल्टीपार्ट नाम एक पैरामीटर के रूप में उपयोग किया जाता है, तो SQL सर्वर को आवश्यकता होती है कि मल्टीपार्ट नाम बनाने वाली पूरी स्ट्रिंग एकल उद्धरण चिह्नों के एक समूह में संलग्न हो।


sp_helptextएकल-भाग (अयोग्य) और मल्टीपार्ट (योग्य) ऑब्जेक्ट नाम दोनों को स्वीकार करने का पहला तर्क ।

T-SQL पार्सर व्याख्या आइटम के बाद तो sp_helptextएक के रूप में केवल एक नाम (ऊपर चार बुलेट बिंदुओं के अनुसार) है, जिसके परिणामस्वरूप नाम प्रक्रिया द्वारा की उम्मीद (स्ट्रिंग प्रकार) तर्क मान के रूप में पारित कर दिया है।

जब पार्सर इसे मल्टीपार्ट नाम के रूप में देखता है , तो पाठ को एकल उद्धरण चिह्नों से घिरा होना आवश्यक है।

मल्टीपार्ट नाम की मुख्य विशेषता एक .विभाजक (किसी भी सीमांकक के बाहर) है।

प्रश्न के इन उदाहरणों को एकल-भाग नामों के रूप में सफलतापूर्वक व्याख्या किया गया है:

myproc - सिंगल-पार्ट (उद्धरण चिह्नों या सीमांकक के बिना - बुलेट # 1)
[myproc] - सिंगल-पार्ट (ब्रैकेट में - बुलेट # 4)
'myproc' - सिंगल-पार्ट (एकल उद्धरण चिह्नों में - बुलेट # 2)
'dbo.myproc' - बहुखण्डीय आवश्यक एकल उद्धरण चिह्न के साथ
[dbo.myproc] - एकल-भाग (कोष्ठक में - बुलेट # 4)

प्रश्न से अंतिम दो उदाहरणों को मल्टीपार्ट पैरामीटर नाम (उजागर .विभाजक के कारण ) के रूप में देखा गया है। वे एक त्रुटि उत्पन्न करते हैं क्योंकि उनके पास एक उद्धरण चिह्नों की आवश्यकता नहीं होती है:

dbo.myproc - आवश्यक एकल उद्धरण चिह्नों के बिना मल्टीपार्ट करें
[dbo]। [myproc] - आवश्यक एकल उद्धरण चिह्नों के बिना मल्टीपार्ट करें

दोहरे उद्धरण चिह्नों का उपयोग करने वाला यह अतिरिक्त उदाहरण सफल है:

"dbo.myproc" - सिंगल-पार्ट (दोहरे उद्धरण चिह्नों में - बुलेट पॉइंट # 3)

ध्यान दें कि इसे एक एकल एकल नाम के रूप में सफलतापूर्वक (प्रक्रिया पैरामीटर मान के लिए) व्याख्यायित किया जाता है, लेकिन प्रक्रिया कोड इसे लचीले ढंग से (उपयोग PARSENAMEऔर OBJECTID) प्राप्त करता है ।

ब्याज के अंतिम बिंदु के रूप में, ध्यान दें कि यहां दोहरे उद्धरण चिह्नों का उपयोग करना सेटिंग पर निर्भर नहीं करता है QUOTED_IDENTIFIER

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.