2010-09-13 9 views
78

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

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

+2

संभावित डुप्लिकेट [";" के बीच क्या अंतर है और टीएसक्यूएल (एसक्यूएल 2008) में "जाओ"?] (http://stackoverflow.com/questions/1517527/what-is-the-difference-between-and-go-in-tsql-sql-2008) – JohnFx

उत्तर

79

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

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

मुख्य अपवाद, और जगह जहां ; का उपयोग आम तालिका अभिव्यक्ति वक्तव्य से पहले किया जाता है।

+3

पर जोर 'जाओ' टी-एसक्यूएल भाग नहीं है, जबकि ' – msarchet

+2

एक 'मेर्ज' कथन सेमी-कोलन द्वारा समाप्त किया जाना चाहिए। – onedaywhen

+13

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

6

जाओ एक बैच टर्मिनेटर है, अर्ध-कॉलन एक कथन टर्मिनेटर है।

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

+0

एक 'मेर्ज' कथन अर्ध-कॉलन द्वारा समाप्त किया जाना चाहिए। – onedaywhen

9

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

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

जैसा कि अन्य ने बताया है, एक सामान्य तालिका अभिव्यक्ति (सीटीई) से पहले का बयान सेमी-कोलन से समाप्त होना चाहिए।

;WITH ... 

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

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

+2

"* जो मुझे लगता है वास्तव में अजीब लग रहा है *" - मैं और अधिक सहमत नहीं हो सका। और इसकी निरंतर पुनरावृत्ति अजीब प्रश्नों की ओर ले जाती है जैसे [यह] (http://stackoverflow.com/questions/26670414/how-use-with-in-subquery-ms-sql) या [यह] (http: // stackoverflow.com/questions/26233895/cte-execute-commands-before-using-the-cte-table) –

+0

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

+0

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

32

जाओ

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

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

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

अर्द्धविराम

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

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

हालांकि, सीटीई की मांग है कि यह पहला कथन है, इसलिए आपको इससे पहले अर्धविराम की आवश्यकता है।

+3

एक 'मेर्ज' कथन अर्ध-कॉलन द्वारा समाप्त किया जाना चाहिए। – onedaywhen

67

जेनरेटेड डीडीएल स्क्रिप्ट में इतने सारे जीओ को देखने का कारण बैच के बारे में निम्नलिखित rule है।

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

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

+8

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

संबंधित मुद्दे