मुझे SQL सर्वर में अर्धविराम का उपयोग कब करना चाहिए?


221

SQL सर्वर प्रबंधन स्टूडियो द्वारा उत्पन्न वेब और स्क्रिप्ट पर कुछ कोड की जाँच करते समय मैंने देखा है कि कुछ बयान अर्धविराम के साथ समाप्त हो गए हैं।

तो मुझे इसका उपयोग कब करना चाहिए?


23
SQL सर्वर 2008 R2 msdn.microsoft.com/en-us/library/ms177563.aspx "Transact-SQL Syntax Conventions (Transact-SQL)" ; == Transact-SQL स्टेटमेंट टर्मिनेटर। हालाँकि SQL सर्वर के इस संस्करण में अधिकांश कथनों के लिए अर्धविराम की आवश्यकता नहीं है , लेकिन भविष्य के संस्करण में इसकी आवश्यकता होगी
gerryLowry

2
हालांकि वे दावा करते हैं कि भविष्य के संस्करण में अर्धविराम की आवश्यकता होगी यह कभी भी सच नहीं होगा। वे संगतता कारणों के लिए कभी भी जनादेश नहीं दे सकते। यह लगभग 100% अनुप्रयोगों को तोड़ देगा।
usr

1
यह अब 2019 है और SQL सर्वर के नवीनतम संस्करण में कोई अर्धविराम अभी भी खुशी से स्वीकार नहीं किया गया है। जैसा कि @usr कहते हैं, जब तक कि Microsoft 100% क्लीन ब्रेक नहीं बनाना चाहता, कोई भी तरीका नहीं है जिससे वे इसे लागू कर सकें।
इयान केम्प

जवाबों:


152

केन पॉवर्स द्वारा SQLServerCentral.Com लेख से:

अर्धविराम

अर्धविराम चरित्र एक बयान टर्मिनेटर है। यह ANSI SQL-92 मानक का एक हिस्सा है, लेकिन इसका उपयोग Transact-SQL के भीतर कभी नहीं किया गया था। वास्तव में, कभी भी अर्धविराम का सामना किए बिना टी-एसक्यूएल को कोड करना संभव था।

प्रयोग

ऐसी दो स्थितियाँ हैं जिनमें आपको अर्धविराम का उपयोग करना चाहिए। पहली स्थिति वह है जहाँ आप एक कॉमन टेबल एक्सप्रेशन (CTE) का उपयोग करते हैं, और CTE बैच में पहला स्टेटमेंट नहीं है। दूसरा वह स्थान है जहाँ आप एक सर्विस ब्रोकर स्टेटमेंट जारी करते हैं और सर्विस ब्रोकर स्टेटमेंट बैच में पहला स्टेटमेंट नहीं होता है।


9
क्या THROWसेवा ब्रोकर का कथन है? हमें इस उदाहरण में एक फेंक से पहले एक अर्ध-उपनिवेश को शामिल करने की आवश्यकता है:BEGIN ;THROW @Error, 'Invalid FundingID', 2; RETURN END
क्रिस वॉल्श

1
लगता है कि वे मूल रूप से अर्धविराम के उपयोग को प्रोत्साहित कर रहे हैं, हाल के वर्षों में पेश किए गए सभी नए बयान प्रकारों से पहले इसकी आवश्यकता होती है। ( MERGEभी उदाहरण के लिए)। जैसा कि अन्य उत्तरों में उल्लेख किया गया है, एएनएसआई मानक में उनकी आवश्यकता होती है
मार्क सॉलुल

2
@ मौरोकैम मुझे लगता है कि आपने दस्तावेज़ को गलत तरीके से पढ़ा है। यदि आप उस लिंक को देखते हैं तो यह कहता है " अर्धविराम के साथ लेनदेन-एसक्यूएल बयानों को समाप्त नहीं करना ।" पदावनत किया गया है।
कलस्टर

जैसा कि मैं देख रहा हूं, यह वास्तव में इस सवाल को संबोधित नहीं करता है कि किसी को कब (जैसा विरोध करना चाहिए ) अर्धविराम का उपयोग करना चाहिए
स्टीवर्ट

81

डिफ़ॉल्ट रूप से, SQL कथन अर्धविराम के साथ समाप्त हो जाते हैं। जब तक आप (शायद ही कभी) एक नया स्टेटमेंट टर्मिनेटर सेट न करें, तब तक आप स्टेटमेंट को समाप्त करने के लिए अर्धविराम का उपयोग करें।

यदि आप सिर्फ एक बयान भेज रहे हैं, तो तकनीकी रूप से आप स्टेटमेंट टर्मिनेटर से दूर हो सकते हैं; एक स्क्रिप्ट में, जैसा कि आप एक से अधिक कथन भेज रहे हैं, आपको इसकी आवश्यकता है।

व्यवहार में, हमेशा टर्मिनेटर को शामिल करें, भले ही आप डेटाबेस में केवल एक बयान भेज रहे हों।

संपादित करें: कहने वाले बयान के जवाब में टर्मिनेटर की आवश्यकता नहीं है [विशेष RDBMS], जबकि यह सच हो सकता है, वे ANSI SQL मानक द्वारा आवश्यक हैं। सभी प्रोग्रामिंग में, अगर हम कार्यक्षमता के नुकसान के बिना एक मानक का पालन कर सकते हैं, तो हमें करना चाहिए, क्योंकि तब न तो हमारा कोड या हमारी आदतें एक मालिकाना विक्रेता से बंधी हैं।

कुछ सी संकलकों के साथ, मुख्य रिटर्न शून्य होना संभव है, भले ही मानक को वापस लौटने के लिए मानक की आवश्यकता हो। लेकिन ऐसा करने से हमारा कोड, और स्वयं, कम पोर्टेबल होता है।

प्रभावी ढंग से प्रोग्रामिंग में सबसे बड़ी कठिनाई नई चीजों को सीखना नहीं है, यह बुरी आदतों को हटा रहा है। इस हद तक कि हम पहली जगह में बुरी आदतों को प्राप्त करने से बच सकते हैं, यह हमारे लिए, हमारे कोड के लिए और किसी को पढ़ने या हमारे कोड का उपयोग करने के लिए एक जीत है।


26

SQL2008 BOL में वे कहते हैं कि अगले रिलीज़ में अर्धविरामों की आवश्यकता होगी। इसलिए हमेशा इसका इस्तेमाल करें।

संदर्भ:


25

आप इसका इस्तेमाल जरूर करें।

बयानों को समाप्त करने के लिए एक अर्धविराम का उपयोग करने की प्रथा मानक है और वास्तव में कई अन्य डेटाबेस प्लेटफार्मों में एक आवश्यकता है। SQL सर्वर को केवल विशेष मामलों में अर्धविराम की आवश्यकता होती है - लेकिन ऐसे मामलों में जहां अर्धविराम की आवश्यकता नहीं होती है, किसी एक का उपयोग करने से समस्या नहीं होती है। मैं दृढ़ता से अनुशंसा करता हूं कि आप एक अर्धविराम के साथ सभी कथनों को समाप्त करने का अभ्यास अपनाएं। न केवल यह आपके कोड की पठनीयता में सुधार करेगा, बल्कि कुछ मामलों में यह आपको कुछ दुःखों से बचा सकता है। (जब एक अर्धविराम आवश्यक होता है और निर्दिष्ट नहीं किया जाता है, तो SQL सर्वर द्वारा उत्पन्न त्रुटि संदेश हमेशा बहुत स्पष्ट नहीं होता है।)

और सबसे महत्वपूर्ण:

SQL सर्वर दस्तावेज़ीकरण इंगित करता है कि अर्धविराम के साथ टी-एसक्यूएल बयानों को समाप्त नहीं करना एक पदावनत विशेषता है। इसका मतलब यह है कि दीर्घकालिक लक्ष्य उत्पाद के भविष्य के संस्करण में अर्धविराम के उपयोग को लागू करना है। यह एक और कारण है कि आपके सभी बयानों को समाप्त करने की आदत में, यहां तक ​​कि जहां वर्तमान में इसकी आवश्यकता नहीं है।

स्रोत: इट्ज़िक बेन-गण द्वारा माइक्रोसॉफ्ट एसक्यूएल सर्वर 2012 टी-एसक्यूएल फंडामेंटल्स


आप हमेशा उपयोग क्यों करना चाहिए इसका एक उदाहरण ;निम्नलिखित दो प्रश्न हैं (इस पोस्ट से कॉपी ):

BEGIN TRY
    BEGIN TRAN
    SELECT 1/0 AS CauseAnException
    COMMIT
END TRY
BEGIN CATCH
    SELECT ERROR_MESSAGE()
    THROW
END CATCH

यहां छवि विवरण दर्ज करें

BEGIN TRY
    BEGIN TRAN
    SELECT 1/0 AS CauseAnException;
    COMMIT
END TRY
BEGIN CATCH
    SELECT ERROR_MESSAGE();
    THROW
END CATCH

यहां छवि विवरण दर्ज करें


7
यह एक मजबूत तर्क है कि आपको अर्धविराम (उद्धरण द्वारा समर्थित) का उपयोग करना चाहिए , लेकिन केवल एक ही मामला है जहां एक होना चाहिए
ग्रेगर थॉमस

3
@Gregor, अगर यह घोषणा की जाती है कि अर्धविरामों का उपयोग करना आवश्यक है और not using themयह पदावनत तकनीक है जिसका आपको उपयोग करना चाहिए। ऐसा नहीं करने पर भविष्य में नुकसान होने का खतरा रहता है। यदि आप जॉब अपग्रेड / स्विच करने की योजना नहीं बना रहे हैं और हमेशा SQL Server 2000 के साथ काम करने जा रहे हैं, तो आप सुरक्षित हैं :-)
gotqn

5
सही, मुझे सहमत होना चाहिए । लेकिन वह आपके उत्तर की पहली पंक्ति पर जोर देना चाहिए , जो मामला नहीं है --- कम से कम अभी तक नहीं।
ग्रेगर थॉमस

2
अर्धविराम के साथ उदाहरण Incorrect syntax near 'THROW'.SQL Server 2008 (10.0.6241.0) पर परिणाम देता है , जो वह संस्करण है जिसे मुझे काम पर निपटाना है। यह 2012 में दिखाए गए अनुसार काम करता है। मैं डेप्रिसिएशन के कारण अर्धविराम का उपयोग शुरू करने के लिए आश्वस्त हूं। मुझे उम्मीद नहीं है कि यह ज्यादातर समय 2008 में एक समस्या होगी।
पायलट_51

1
आपका उत्तर सबसे अच्छा है! यह कहीं अधिक उत्थान के योग्य है।
स्टीवर्ट

22

अगर मैं इसे सही ढंग से पढ़ता हूं, तो TSQL स्टेटमेंट को समाप्त करने के लिए अर्धविराम का उपयोग करना आवश्यक होगा। http://msdn.microsoft.com/en-us/library/ms143729%28v=sql.120%29.aspx

संपादित करें: मुझे SSMS 2008R2 के लिए एक प्लग-इन मिला जो आपकी स्क्रिप्ट को प्रारूपित करेगा और अर्धविराम जोड़ देगा। मुझे लगता है कि यह अभी भी बीटा में है ...

http://www.tsqltidy.com/tsqltidySSMSAddin.aspx

संपादित करें: मुझे ApexSQL नामक एक और भी बेहतर मुफ्त टूल / प्लगइन मिला ... http://www.apexsql.com/


11

व्यक्तिगत राय: जहां आवश्यक हो, केवल उन्हीं का उपयोग करें। (आवश्यक सूची के लिए ऊपर दी गई थीटीएक्सआई का उत्तर देखें।)

चूंकि संकलक को उनकी आवश्यकता नहीं है, इसलिए आप उन्हें सभी डाल सकते हैं, लेकिन क्यों? संकलक आपको यह नहीं बताएगा कि आप कहां भूल गए, इसलिए आप असंगत उपयोग के साथ समाप्त करेंगे।

[यह राय SQL सर्वर के लिए विशिष्ट है। अन्य डेटाबेस में अधिक कठोर आवश्यकताएं हो सकती हैं। यदि आप कई डेटाबेस पर चलने के लिए SQL लिख रहे हैं, तो आपकी आवश्यकताएं भिन्न हो सकती हैं।]

tpdi ने कहा, "एक स्क्रिप्ट में, जैसा कि आप एक से अधिक कथन भेज रहे हैं, आपको इसकी आवश्यकता है।" यह वास्तव में सही नहीं है। आपको उनकी आवश्यकता नहीं है।

PRINT 'Semicolons are optional'
PRINT 'Semicolons are optional'
PRINT 'Semicolons are optional';
PRINT 'Semicolons are optional';

आउटपुट:

Semicolons are optional
Semicolons are optional
Semicolons are optional
Semicolons are optional

1
आप इस चर्चा के बारे में क्या सोचते हैं? sqlservercentral.com/Forums/Topic636549-8-1.aspx (Yoy Bugmenot@bugmenot.com का उपयोग कर सकते हैं: बगमेनॉट यदि आपके पास कोई खाता नहीं है)
अनवर पिंटो

2
मैं सराहना करता हूं कि आपने स्पष्ट रूप से कहा कि यह सिर्फ आपकी राय है, हालांकि मुझे नहीं लगता कि यह एक अच्छा जवाब देता है क्योंकि यह माइक्रोसॉफ्ट के दस्तावेज और एएनएसआई मानक दोनों के साथ संघर्ष करता है। मुझे लगता है कि यह राय एक टिप्पणी में बेहतर होगी। (आपको कोसने की कोशिश नहीं, आप अर्ध-उपनिवेश उपयोग पर आपकी राय के पूरी तरह से हकदार हैं!)
izzy

4

मेरे पास अभी भी टी-एसक्यूएल के बारे में जानने के लिए बहुत कुछ है, लेकिन एक लेन-देन के लिए कुछ कोड काम करने में (और स्टैकओवरफ़्लो और अन्य साइटों के उदाहरणों के आधार पर कोडिंग) मुझे एक मामला मिला जहां लगता है कि अर्धविराम की आवश्यकता है और यदि यह गायब है कथन बिल्कुल भी निष्पादित नहीं होता है और कोई त्रुटि नहीं उठाई जाती है। यह उपरोक्त किसी भी उत्तर में शामिल नहीं किया गया है। (यह एमएस SQL ​​सर्वर 2012 का उपयोग कर रहा था।)

एक बार जब मैं लेन-देन करना चाहता था, तो मैंने इसके चारों ओर एक ट्राइ-कैच डालने का फैसला किया, ताकि अगर कोई त्रुटि हो तो यह वापस आ जाए। ऐसा करने के बाद ही, लेन-देन प्रतिबद्ध नहीं था (SSMS इसकी पुष्टि करता है जब एक अच्छा संदेश के साथ खिड़की को बंद करने की कोशिश कर रहा है, इस तथ्य के लिए आपको चेतावनी देता है कि एक बिना लेनदेन के लेनदेन है।

तो यह

COMMIT TRANSACTION 

BEGIN TRY / END TRY ब्लॉक के बाहर लेन-देन करने के लिए ठीक काम किया है, लेकिन ब्लॉक के अंदर यह होना चाहिए था

COMMIT TRANSACTION;

ध्यान दें कि कोई त्रुटि या चेतावनी प्रदान नहीं की गई है और कोई संकेत नहीं है कि क्वेरी टैब को बंद करने का प्रयास करने तक लेन-देन अभी भी अप्राप्त है।

सौभाग्य से यह इतनी बड़ी समस्या का कारण बनता है कि यह तुरंत स्पष्ट है कि कोई समस्या है। दुर्भाग्य से कोई त्रुटि (सिंटैक्स या अन्यथा) की सूचना दी गई है यह तुरंत स्पष्ट नहीं था कि समस्या क्या थी।

विपरीत-बुद्धिमान, ROLLBACK परिवहन BEGIN CATCH ब्लॉक में समान रूप से या बिना अर्धविराम के समान रूप से काम करता है।

इसके कुछ तर्क हो सकते हैं लेकिन यह मनमाना और एलिस-इन-वंडरलैंड-ईश लगता है।


इसका एक संभावित कारण यह है कि COMMIT TRANSACTIONवैकल्पिक लेन-देन / बचत बिंदु नाम (जिसे वह अनदेखा करेगा) को स्वीकार करता है। एक समाप्ति अर्धविराम के बिना, COMMIT TRANSACTIONअगले प्रतीक को खा सकते हैं यदि यह एक पहचानकर्ता के रूप में आता है, जो कोड के शब्दार्थ को मौलिक रूप से बदल सकता है। यदि इसके बाद त्रुटि होती है, तो CATCHबिना COMMITनिष्पादित किए ट्रिगर हो सकता है । इसके विपरीत, ROLLBACK TRANSACTIONइस तरह से एक वैकल्पिक पहचानकर्ता को भी स्वीकार करते समय , पार्स करने में त्रुटि के परिणामस्वरूप लेन-देन के परिणाम की संभावना सबसे अधिक होती है।
जेरेन मोस्टर्ट

3

ऐसा लगता है कि अर्धविराम कर्सर कार्यों के साथ संयोजन के रूप में नहीं किया जाना चाहिए: OPEN, FETCH, CLOSEऔर DEALLOCATE। मैंने इसके साथ बस कुछ घंटे बर्बाद किए। मुझे बीओएल पर एक करीबी नज़र थी और ध्यान दिया कि [?] इन कर्सर स्टेटमेंट के लिए सिंटैक्स में नहीं दिखाया गया है !!

तो मेरे पास था:

OPEN mycursor;

और इसने मुझे 16916 त्रुटि दी।

परंतु:

OPEN mycursor

काम किया।


2
मुझे नहीं लगता कि यह सही है। BOL स्टेटमेंट सिंटैक्स पर अर्धविराम का उल्लेख करने में बहुत सुसंगत नहीं है, उदाहरण के लिए SELECT पर एक नज़र डालें। इसके अलावा, मैंने कुछ कॉरपोरेट को देखा है; ठीक काम कर रहे हैं, FETCH, CLOSE और DEALLOCATE के लिए समान ...
वैलेंटिनो Vranken

यह मुझे पार्सर के साथ एक बग का सुझाव देता है। SQL सर्वर का कौन सा संस्करण / उपयोग कर रहे थे?
स्टीवर्ट

2

के अनुसार Transact-SQL सिंटेक्स कन्वेंशनों (Transact-SQL) (MSDN)

Transact-SQL स्टेटमेंट टर्मिनेटर। हालाँकि SQL सर्वर के इस संस्करण में अधिकांश कथनों के लिए अर्धविराम की आवश्यकता नहीं है, लेकिन भविष्य के संस्करण में इसकी आवश्यकता होगी।

(@gerryLowry की टिप्पणी भी देखें)


0

एक बैच में एक DISABLE या ENABLE TRIGGER स्टेटमेंट का उपयोग करते समय, जिसमें अन्य स्टेटमेंट होते हैं, स्टेटमेंट को अर्धविराम के साथ समाप्त होने से ठीक पहले देना चाहिए। अन्यथा, आपको एक सिंटैक्स त्रुटि मिलेगी। मैंने अपने बालों को इस एक के साथ बाहर कर दिया ... और बाद में, मैं इस एमएस कनेक्ट आइटम पर ठोकर खाई उसी चीज के बारे में। इसे ठीक नहीं किया जाएगा।

यहाँ देखें


0

नोट: यह प्रश्न के लिखित रूप में उत्तर देता है, लेकिन समस्या के अनुसार नहीं। इसे यहां जोड़ना, क्योंकि लोग इसे खोज रहे होंगे

WITHपुनरावर्ती CTE के बयानों से पहले अर्धविराम का भी उपयोग किया जाता है :

;WITH Numbers AS
(
    SELECT n = 1
    UNION ALL
    SELECT n + 1
    FROM Numbers
    WHERE n+1 <= 10
)
SELECT n
FROM Numbers

यह क्वेरी CTE नामक संख्या उत्पन्न करेगी जिसमें पूर्णांक [1..10] शामिल हैं। यह केवल मान 1 के साथ एक तालिका बनाकर किया जाता है, और फिर 10 तक पहुंचने तक दोहराता है।


8
तकनीकी रूप से 'पहले से नहीं', लेकिन उसके बाद जो कुछ भी आता है। यदि बैच में पहला कथन है, तो किसी अर्धविराम की आवश्यकता नहीं है।
Tor Haugen

इसे पहले भी इस्तेमाल नहीं किया गया है। यह सिर्फ अर्धविराम है जो पिछले कथन को समाप्त करता है। ऐसा लगता है कि कुछ लोगों ने फैसला किया है कि अर्धविराम यहां होना चाहिए क्योंकि यह एक ऐसा परिदृश्य है जिसमें अर्धविराम की आवश्यकता होती है। क्यों इन लोगों ने फैसला किया है कि यह अर्धविराम के साथ हमेशा बयानों को समाप्त करने से बेहतर है , मुझे पता नहीं है।
स्टीवर्ट

0

यदि आप SQLServer में यादृच्छिक कमांड टाइमआउट त्रुटियां प्राप्त करना पसंद करते हैं, तो अपने कमांडटेक्स्ट स्ट्रिंग्स के अंत में सेमी-कोलन को छोड़ दें।

मुझे नहीं पता कि यह कहीं भी प्रलेखित है या यदि यह बग है, लेकिन ऐसा होता है और मैंने इसे कड़वे अनुभव से सीखा है।

मेरे पास SQLServer 2008 का उपयोग करने के लिए सत्यापन योग्य और प्रतिलिपि प्रस्तुत करने योग्य उदाहरण हैं।

उर्फ -> व्यवहार में, हमेशा टर्मिनेटर को शामिल करें, भले ही आप डेटाबेस में केवल एक बयान भेज रहे हों।


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

-2

अर्धवृत्त हमेशा यौगिक चयन कथनों में काम नहीं करते हैं।

एक तुच्छ यौगिक चयन कथन के इन दो अलग-अलग संस्करणों की तुलना करें।

कोड

DECLARE @Test varchar(35); 
SELECT @Test=
    (SELECT 
        (SELECT 
            (SELECT 'Semicolons do not always work fine.';););); 
SELECT @Test Test;

रिटर्न

Msg 102, Level 15, State 1, Line 5
Incorrect syntax near ';'.

हालाँकि, कोड

DECLARE @Test varchar(35)
SELECT @Test=
    (SELECT 
        (SELECT 
            (SELECT 'Semicolons do not always work fine.'))) 
SELECT @Test Test

रिटर्न

Test
-----------------------------------
Semicolons do not always work fine.

(1 row(s) affected)

11
[एक साल बाद]: वाह मैं हैरान हूं कि इस जवाब पर किसी ने अभी तक कोई टिप्पणी नहीं की है! बेशक, यह काम नहीं करेगा, अर्धविराम बयान विभाजक हैं, इसलिए अर्धविराम के साथ आपका कोड है: 1- SELECT @ Test = (SELECT (SELECT 'का चयन करें) अर्धविराम हमेशा ठीक काम नहीं करते हैं;) - यह सही नहीं है कथन 2-); - या तो यह 3- है; - या तो यह कि 4-); - या तो एक अर्धविराम 3 कोष्ठक के बाद होना चाहिए
PhpLou

1
आप केवल बयानों को समाप्त करने के लिए अर्धविराम का उपयोग करते हैं । एक उपवाक्य एक कथन नहीं है। कथन ऐसी चीजें हैं जिन्हें क्रम से निष्पादित किया जाता है। आपके उदाहरण में, तीन कथन हैं: 1. DECLARE @ टेस्ट वर्चर (35) 2. Select @ टेस्ट = (SELECT (SELECT (सेलेक्ट 'सेमीकोलन हमेशा ठीक नहीं होता है।'))) 3. SELECT @ टेस्ट टेस्ट
स्टीवर्ट।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.