SQL सर्वर में, आपको GO का उपयोग कब करना चाहिए और आपको सेमी-कोलोन का उपयोग कब करना चाहिए?


100

जब कमांड के बाद मुझे GO कीवर्ड का उपयोग करना चाहिए और क्या कमांड के अंत में अर्ध-बृहदान्त्र की आवश्यकता है, तो मुझे हमेशा उलझन होती है। अंतर क्या है और मुझे उनका उपयोग क्यों और कब करना चाहिए?

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


जवाबों:


93

GOकेवल SSMS से संबंधित है - यह वास्तविक Transact SQL नहीं है, यह SSMS को GOव्यक्तिगत रूप से प्रत्येक बैच के बीच SQL स्टेटमेंट को क्रमबद्ध तरीके से भेजने के लिए कहता है ।

;एक एसक्यूएल बयान सीमांकक है, लेकिन अधिकांश भाग के लिए इंजन की व्याख्या कर सकते हैं जहाँ आपके बयान टूट रहे हैं।

मुख्य अपवाद, और वह जगह जहां ;सबसे अधिक बार उपयोग किया जाता है, एक कॉमन टेबल एक्सप्रेशन स्टेटमेंट से पहले है।


5
पर जोर GOT-SQL भाग जबकि नहीं है ;है
msarchet

2
एक MERGEबयान को अर्ध-उपनिवेश द्वारा समाप्त किया जाना चाहिए।
onedaywhen

15
अद्यतन: SQL सर्वर 2012 में अर्धविराम का उपयोग नहीं किया गया है, जिसका अर्थ है कि उन्हें अगले संस्करण में आवश्यक होगा। तो अर्धविरामों का उपयोग करना एक अच्छा अभ्यास है, क्योंकि प्रवास के मामले में इसे कम काम की आवश्यकता होगी (और क्योंकि यह एक मानक है)। स्रोत: technet.microsoft.com/en-us/library/ms143729.aspx या SQL सर्वर पर पुस्तक 2012: shop.oreilly.com/product/0790145321978.do
पावेल Bulwan

1
SQL 2014 अभी भी अगले संस्करण के लिए आवश्यक के रूप में अर्धविराम सूचीबद्ध करता है। मुझे आश्चर्य है कि जब इसे अपदस्थ किया जाएगा। Technet.microsoft.com/en-us/library/ms143729.aspx
फ्रैंक

2
+ buli को यह नहीं बताया गया है कि ;यह पदावनत नहीं है, इसका उपयोग नहीं किया जाता है, अर्थात यह स्रोत के अनुसार अनिवार्य होने जा रहा है।
cjk

78

जनरेटेड डीडीएल स्क्रिप्ट्स में आपको बहुत सारे GO के कारण दिखाई देते हैं क्योंकि यह बैचों के बारे में निम्नलिखित नियम है।

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

जेनरेट डीडीएल के लिए उपयोग के मामलों में से एक एकल फ़ाइल में कई ऑब्जेक्ट उत्पन्न करना है। इस वजह से DDL जनरेटर को बैच उत्पन्न करने में सक्षम होना चाहिए। जैसा कि अन्य ने कहा है कि GO स्टेटमेंट बैच को समाप्त करता है।


10
यह एकमात्र ऐसा व्यक्ति है जिसने वास्तव में "... आपको GO ... का उपयोग कब करना चाहिए?" सवाल का हिस्सा।
Roimer

मुझे ऐसा लगता है कि GO कथन को समाप्त करता है जो SQL युक्त ऑब्जेक्ट बनाता है जिसमें हो सकता है; स्टेटमेंट टर्मिनेटर। एक अन्य DBMS में मैंने समाप्ति स्ट्रिंग को सेट करने की क्षमता देखी है। उदाहरण के लिए, आप निर्दिष्ट कर सकते हैं कि कथन दो पाइप वर्णों के साथ समाप्त होते हैं || फिर आप क्रिएट प्रक्रिया जारी कर सकते हैं ... बहुत एसक्यूएल समाप्त हो रहा है; ... || और डबल पाइप क्रिएट प्रक्रिया विवरण समाप्त होता है। तो मेरा सवाल यह है कि क्या यह MS GO स्टेटमेंट के लिए एनालिसिस है? दूसरे, क्या आप SQLSERVER में समाप्ति स्ट्रिंग को फिर से परिभाषित कर सकते हैं?
youcantryreachingme

@youcantryreachingme मुझे नहीं पता कि क्या यह 2010 में सच था लेकिन ऐसा लगता है कि आप कर सकते हैं। SSMS देखें : बैच सेपरेटर । मुझे यकीन नहीं है कि इस की सीमाएं क्या हैं
कॉनरेड फ्रीक्स

34

जाओ

गो एक बैच सेपरेटर है। इसका मतलब यह है कि उस बैच में सब कुछ उस विशेष बैच के लिए स्थानीय है।

वेरिएबल्स, टेबल वेरिएबल्स, आदि की कोई भी घोषणा GOबयानों में नहीं जाती है ।

# टैम्पलेट टेबल एक कनेक्शन के लिए स्थानीय हैं, इसलिए वे GO स्टेटमेंट्स में फैले हैं।

सेमीकोलन

एक अर्धविराम एक बयान टर्मिनेटर है। यह विशुद्ध रूप से यह पहचानने के लिए उपयोग किया जाता है कि एक विशेष वक्तव्य समाप्त हो गया है।

ज्यादातर मामलों में, बयान के अंत को निर्धारित करने के लिए स्टेटमेंट सिंटैक्स ही पर्याप्त होता है।

CTE की हालांकि, मांग है कि विथ फर्स्ट स्टेटमेंट है, इसलिए विथ अम्पायरोकोन विथ थे।


4
एक MERGEबयान को अर्ध-उपनिवेश द्वारा समाप्त किया जाना चाहिए।
onedaywhen

11

आपको प्रत्येक एसक्यूएल स्टेटमेंट को समाप्त करने के लिए एक अर्ध-उपनिवेश का उपयोग करना चाहिए। इसे SQL मानकों में परिभाषित किया गया है,

निश्चित रूप से, अधिक बार SQL सर्वर आपको स्टेटमेंट टर्मिनेटर से बाहर निकलने की अनुमति नहीं देता है, लेकिन बुरी आदतों में क्यों?

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

;WITH ...

जो मुझे लगता है कि वास्तव में अजीब लगता है। मुझे लगता है कि यह एक ऑनलाइन मंच में समझ में आता है जब आप कोड की गुणवत्ता नहीं बता सकते हैं तो इसे चिपकाया जाएगा।

इसके अतिरिक्त, एक MERGEबयान को अर्ध-उपनिवेश द्वारा समाप्त किया जाना चाहिए। क्या आपको यहां कोई पैटर्न दिखता है? ये TSQL के नए परिवर्धन के एक जोड़े हैं जो SQL मानकों का बारीकी से पालन करते हैं। ऐसा लगता है कि SQL सर्वर टीम अर्ध-उपनिवेशक टर्मिनेटर के उपयोग को अनिवार्य बनाने की राह पर चल रही है।


2
" जो मुझे लगता है कि वास्तव में अजीब लगता है " - मैं और अधिक सहमत नहीं हो सकता था। और जैसे अजीब सवाल को यह सुराग की लगातार पुनरावृत्ति इस या इस
a_horse_with_no_name

SQL सर्वर आपको सुस्त होने की अनुमति नहीं देता है - यह आपको एक निरर्थक स्टेटमेंट टर्मिनेटर को छोड़ने की अनुमति देता है; टी-एसक्यूएल, अन्य एसक्यूएल की तरह, शुद्ध मानक एसक्यूएल नहीं है, जो अमूर्त आधार वर्ग की तरह है - डीबी इंजन की अपनी बोली के पक्ष में व्यवहार में उपयोग नहीं किया जाता है।
ProfK

@ProfK: आपकी टिप्पणी में विराम चिह्नों को शामिल करने के लिए धन्यवाद, जिससे मुझे पढ़ना और समझना आसान हो गया, विशेष रूप से वाक्य टर्मिनेटर वर्ण। हालाँकि, हाइफ़न का आपका उपयोग मानक अंग्रेजी का अनुपालन नहीं करता है ...
onedaywhen

8

जीओ एक बैच टर्मिनेटर है, एक अर्ध-कोलोन एक स्टेटमेंट टर्मिनेटर है।

जब आप 1 स्क्रिप्ट में एकाधिक क्रिएट स्टेटमेंट्स बनाना चाहते हैं तो आप GO का उपयोग करेंगे क्योंकि क्रिएट को बैच में पहला स्टेटमेंट होना चाहिए। यदि आप सामान्य तालिका अभिव्यक्तियों का उपयोग करते हैं तो इससे पहले के कथन को अर्ध-उपनिवेश के साथ समाप्त करने की आवश्यकता है


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