SQL सर्वर प्रबंधन स्टूडियो द्वारा उत्पन्न वेब और स्क्रिप्ट पर कुछ कोड की जाँच करते समय मैंने देखा है कि कुछ बयान अर्धविराम के साथ समाप्त हो गए हैं।
तो मुझे इसका उपयोग कब करना चाहिए?
SQL सर्वर प्रबंधन स्टूडियो द्वारा उत्पन्न वेब और स्क्रिप्ट पर कुछ कोड की जाँच करते समय मैंने देखा है कि कुछ बयान अर्धविराम के साथ समाप्त हो गए हैं।
तो मुझे इसका उपयोग कब करना चाहिए?
जवाबों:
केन पॉवर्स द्वारा SQLServerCentral.Com लेख से:
अर्धविराम
अर्धविराम चरित्र एक बयान टर्मिनेटर है। यह ANSI SQL-92 मानक का एक हिस्सा है, लेकिन इसका उपयोग Transact-SQL के भीतर कभी नहीं किया गया था। वास्तव में, कभी भी अर्धविराम का सामना किए बिना टी-एसक्यूएल को कोड करना संभव था।
प्रयोग
ऐसी दो स्थितियाँ हैं जिनमें आपको अर्धविराम का उपयोग करना चाहिए। पहली स्थिति वह है जहाँ आप एक कॉमन टेबल एक्सप्रेशन (CTE) का उपयोग करते हैं, और CTE बैच में पहला स्टेटमेंट नहीं है। दूसरा वह स्थान है जहाँ आप एक सर्विस ब्रोकर स्टेटमेंट जारी करते हैं और सर्विस ब्रोकर स्टेटमेंट बैच में पहला स्टेटमेंट नहीं होता है।
THROWसेवा ब्रोकर का कथन है? हमें इस उदाहरण में एक फेंक से पहले एक अर्ध-उपनिवेश को शामिल करने की आवश्यकता है:BEGIN ;THROW @Error, 'Invalid FundingID', 2; RETURN END
MERGEभी उदाहरण के लिए)। जैसा कि अन्य उत्तरों में उल्लेख किया गया है, एएनएसआई मानक में उनकी आवश्यकता होती है
डिफ़ॉल्ट रूप से, SQL कथन अर्धविराम के साथ समाप्त हो जाते हैं। जब तक आप (शायद ही कभी) एक नया स्टेटमेंट टर्मिनेटर सेट न करें, तब तक आप स्टेटमेंट को समाप्त करने के लिए अर्धविराम का उपयोग करें।
यदि आप सिर्फ एक बयान भेज रहे हैं, तो तकनीकी रूप से आप स्टेटमेंट टर्मिनेटर से दूर हो सकते हैं; एक स्क्रिप्ट में, जैसा कि आप एक से अधिक कथन भेज रहे हैं, आपको इसकी आवश्यकता है।
व्यवहार में, हमेशा टर्मिनेटर को शामिल करें, भले ही आप डेटाबेस में केवल एक बयान भेज रहे हों।
संपादित करें: कहने वाले बयान के जवाब में टर्मिनेटर की आवश्यकता नहीं है [विशेष RDBMS], जबकि यह सच हो सकता है, वे ANSI SQL मानक द्वारा आवश्यक हैं। सभी प्रोग्रामिंग में, अगर हम कार्यक्षमता के नुकसान के बिना एक मानक का पालन कर सकते हैं, तो हमें करना चाहिए, क्योंकि तब न तो हमारा कोड या हमारी आदतें एक मालिकाना विक्रेता से बंधी हैं।
कुछ सी संकलकों के साथ, मुख्य रिटर्न शून्य होना संभव है, भले ही मानक को वापस लौटने के लिए मानक की आवश्यकता हो। लेकिन ऐसा करने से हमारा कोड, और स्वयं, कम पोर्टेबल होता है।
प्रभावी ढंग से प्रोग्रामिंग में सबसे बड़ी कठिनाई नई चीजों को सीखना नहीं है, यह बुरी आदतों को हटा रहा है। इस हद तक कि हम पहली जगह में बुरी आदतों को प्राप्त करने से बच सकते हैं, यह हमारे लिए, हमारे कोड के लिए और किसी को पढ़ने या हमारे कोड का उपयोग करने के लिए एक जीत है।
SQL2008 BOL में वे कहते हैं कि अगले रिलीज़ में अर्धविरामों की आवश्यकता होगी। इसलिए हमेशा इसका इस्तेमाल करें।
संदर्भ:
आप इसका इस्तेमाल जरूर करें।
बयानों को समाप्त करने के लिए एक अर्धविराम का उपयोग करने की प्रथा मानक है और वास्तव में कई अन्य डेटाबेस प्लेटफार्मों में एक आवश्यकता है। 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

not using themयह पदावनत तकनीक है जिसका आपको उपयोग करना चाहिए। ऐसा नहीं करने पर भविष्य में नुकसान होने का खतरा रहता है। यदि आप जॉब अपग्रेड / स्विच करने की योजना नहीं बना रहे हैं और हमेशा SQL Server 2000 के साथ काम करने जा रहे हैं, तो आप सुरक्षित हैं :-)
Incorrect syntax near 'THROW'.SQL Server 2008 (10.0.6241.0) पर परिणाम देता है , जो वह संस्करण है जिसे मुझे काम पर निपटाना है। यह 2012 में दिखाए गए अनुसार काम करता है। मैं डेप्रिसिएशन के कारण अर्धविराम का उपयोग शुरू करने के लिए आश्वस्त हूं। मुझे उम्मीद नहीं है कि यह ज्यादातर समय 2008 में एक समस्या होगी।
अगर मैं इसे सही ढंग से पढ़ता हूं, तो 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/
व्यक्तिगत राय: जहां आवश्यक हो, केवल उन्हीं का उपयोग करें। (आवश्यक सूची के लिए ऊपर दी गई थीटीएक्सआई का उत्तर देखें।)
चूंकि संकलक को उनकी आवश्यकता नहीं है, इसलिए आप उन्हें सभी डाल सकते हैं, लेकिन क्यों? संकलक आपको यह नहीं बताएगा कि आप कहां भूल गए, इसलिए आप असंगत उपयोग के साथ समाप्त करेंगे।
[यह राय 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
मेरे पास अभी भी टी-एसक्यूएल के बारे में जानने के लिए बहुत कुछ है, लेकिन एक लेन-देन के लिए कुछ कोड काम करने में (और स्टैकओवरफ़्लो और अन्य साइटों के उदाहरणों के आधार पर कोडिंग) मुझे एक मामला मिला जहां लगता है कि अर्धविराम की आवश्यकता है और यदि यह गायब है कथन बिल्कुल भी निष्पादित नहीं होता है और कोई त्रुटि नहीं उठाई जाती है। यह उपरोक्त किसी भी उत्तर में शामिल नहीं किया गया है। (यह एमएस SQL सर्वर 2012 का उपयोग कर रहा था।)
एक बार जब मैं लेन-देन करना चाहता था, तो मैंने इसके चारों ओर एक ट्राइ-कैच डालने का फैसला किया, ताकि अगर कोई त्रुटि हो तो यह वापस आ जाए। ऐसा करने के बाद ही, लेन-देन प्रतिबद्ध नहीं था (SSMS इसकी पुष्टि करता है जब एक अच्छा संदेश के साथ खिड़की को बंद करने की कोशिश कर रहा है, इस तथ्य के लिए आपको चेतावनी देता है कि एक बिना लेनदेन के लेनदेन है।
तो यह
COMMIT TRANSACTION
BEGIN TRY / END TRY ब्लॉक के बाहर लेन-देन करने के लिए ठीक काम किया है, लेकिन ब्लॉक के अंदर यह होना चाहिए था
COMMIT TRANSACTION;
ध्यान दें कि कोई त्रुटि या चेतावनी प्रदान नहीं की गई है और कोई संकेत नहीं है कि क्वेरी टैब को बंद करने का प्रयास करने तक लेन-देन अभी भी अप्राप्त है।
सौभाग्य से यह इतनी बड़ी समस्या का कारण बनता है कि यह तुरंत स्पष्ट है कि कोई समस्या है। दुर्भाग्य से कोई त्रुटि (सिंटैक्स या अन्यथा) की सूचना दी गई है यह तुरंत स्पष्ट नहीं था कि समस्या क्या थी।
विपरीत-बुद्धिमान, ROLLBACK परिवहन BEGIN CATCH ब्लॉक में समान रूप से या बिना अर्धविराम के समान रूप से काम करता है।
इसके कुछ तर्क हो सकते हैं लेकिन यह मनमाना और एलिस-इन-वंडरलैंड-ईश लगता है।
COMMIT TRANSACTIONवैकल्पिक लेन-देन / बचत बिंदु नाम (जिसे वह अनदेखा करेगा) को स्वीकार करता है। एक समाप्ति अर्धविराम के बिना, COMMIT TRANSACTIONअगले प्रतीक को खा सकते हैं यदि यह एक पहचानकर्ता के रूप में आता है, जो कोड के शब्दार्थ को मौलिक रूप से बदल सकता है। यदि इसके बाद त्रुटि होती है, तो CATCHबिना COMMITनिष्पादित किए ट्रिगर हो सकता है । इसके विपरीत, ROLLBACK TRANSACTIONइस तरह से एक वैकल्पिक पहचानकर्ता को भी स्वीकार करते समय , पार्स करने में त्रुटि के परिणामस्वरूप लेन-देन के परिणाम की संभावना सबसे अधिक होती है।
ऐसा लगता है कि अर्धविराम कर्सर कार्यों के साथ संयोजन के रूप में नहीं किया जाना चाहिए: OPEN, FETCH, CLOSEऔर DEALLOCATE। मैंने इसके साथ बस कुछ घंटे बर्बाद किए। मुझे बीओएल पर एक करीबी नज़र थी और ध्यान दिया कि [?] इन कर्सर स्टेटमेंट के लिए सिंटैक्स में नहीं दिखाया गया है !!
तो मेरे पास था:
OPEN mycursor;
और इसने मुझे 16916 त्रुटि दी।
परंतु:
OPEN mycursor
काम किया।
के अनुसार Transact-SQL सिंटेक्स कन्वेंशनों (Transact-SQL) (MSDN)
Transact-SQL स्टेटमेंट टर्मिनेटर। हालाँकि SQL सर्वर के इस संस्करण में अधिकांश कथनों के लिए अर्धविराम की आवश्यकता नहीं है, लेकिन भविष्य के संस्करण में इसकी आवश्यकता होगी।
(@gerryLowry की टिप्पणी भी देखें)
एक बैच में एक DISABLE या ENABLE TRIGGER स्टेटमेंट का उपयोग करते समय, जिसमें अन्य स्टेटमेंट होते हैं, स्टेटमेंट को अर्धविराम के साथ समाप्त होने से ठीक पहले देना चाहिए। अन्यथा, आपको एक सिंटैक्स त्रुटि मिलेगी। मैंने अपने बालों को इस एक के साथ बाहर कर दिया ... और बाद में, मैं इस एमएस कनेक्ट आइटम पर ठोकर खाई उसी चीज के बारे में। इसे ठीक नहीं किया जाएगा।
यहाँ देखें
नोट: यह प्रश्न के लिखित रूप में उत्तर देता है, लेकिन समस्या के अनुसार नहीं। इसे यहां जोड़ना, क्योंकि लोग इसे खोज रहे होंगे
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 तक पहुंचने तक दोहराता है।
यदि आप SQLServer में यादृच्छिक कमांड टाइमआउट त्रुटियां प्राप्त करना पसंद करते हैं, तो अपने कमांडटेक्स्ट स्ट्रिंग्स के अंत में सेमी-कोलन को छोड़ दें।
मुझे नहीं पता कि यह कहीं भी प्रलेखित है या यदि यह बग है, लेकिन ऐसा होता है और मैंने इसे कड़वे अनुभव से सीखा है।
मेरे पास SQLServer 2008 का उपयोग करने के लिए सत्यापन योग्य और प्रतिलिपि प्रस्तुत करने योग्य उदाहरण हैं।
उर्फ -> व्यवहार में, हमेशा टर्मिनेटर को शामिल करें, भले ही आप डेटाबेस में केवल एक बयान भेज रहे हों।
अर्धवृत्त हमेशा यौगिक चयन कथनों में काम नहीं करते हैं।
एक तुच्छ यौगिक चयन कथन के इन दो अलग-अलग संस्करणों की तुलना करें।
कोड
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)