2017-05-11 6 views
7

मैं मेरी समझ से एक साधारण क्वेरीएसओएल कथन के साथ SQL सर्वर प्रबंधन स्टूडियो में और बिना बयान के एसक्यूएल कथन कैसे निष्पादित करते हैं?

CREATE TABLE #tempTable (id int) 
DROP TABLE #tempTable 

CREATE TABLE #tempTable (id int) 
DROP TABLE #tempTable 

है, दूसरे भाग में, यह #tempTable बनाना चाहिए।

लेकिन यह निम्न त्रुटि

संदेश 2714, स्तर 16, राज्य 1, पंक्ति 4
से पता चलता वहां पहले से ही एक वस्तु '#tempTable' डेटाबेस में नामित किया गया है।

मैंने कारण खोजा है और पाया है कि यह क्वेरी के दो भाग के बीच GO कथन के कारण है। इसलिए, सही क्वेरी

CREATE TABLE #tempTable (id int) 
DROP TABLE #tempTable 
GO  

CREATE TABLE #tempTable (id int) 
DROP TABLE #tempTable 

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

मेरा सवाल है, एसक्यूएल कथन कैसे निष्पादित किए जाते हैं? क्या यह अनुक्रमिक रूप से निष्पादित नहीं है?

यदि यह क्रमिक रूप से निष्पादित करता है, तो मेरी पहली क्वेरी में त्रुटि क्यों होती है?

+1

'GO' है ** नहीं ** एक एसक्यूएल बयान - यह एक ** बैच विभाजक ** प्रबंधन स्टूडियो GUI उपकरण द्वारा परिभाषित किया गया है। –

+0

जानकारी के लिए धन्यवाद :) –

उत्तर

5

SQL सर्वर documentation यह समझाने का एक अच्छा काम करता है।

आपके विशेष मामले में, समस्या संकलन-समय त्रुटियों के विरुद्ध संकलन-समय त्रुटियों है।

यह कैसे काम करता है? बयान को अलग करने के GO के बिना, सभी एक ही समय में संकलित हैं। समस्या यह है कि तीसरा कथन CREATE TABLE कथन है और तालिका पहले से मौजूद है। जो कुछ हुआ वह यह है कि बयानों को पार्स और संकलित किया जाता है।

GO के साथ, पहले दो कथन संकलित और निष्पादित किए गए हैं। देखा! तीसरे कथन में CREATE के लिए कोई तालिका नहीं है।

+1

ठीक है, बिंदु मिला :)। मुझे लगता था कि, एसक्यूएल प्रश्नों का अर्थ है। लेकिन मुझे जानकर उत्सुकता है, क्या 'ड्रोप टेबल # tempTable' समझने वाला संकलक नहीं है? –

+0

@Noorashuvo यह सिंटैक्स के लिए सिर्फ पार्सर है जैसा मैंने अपने जवाब में कहा था। कंपाइलर सिर्फ एक वाक्यविन्यास की जांच करें जो तर्क नहीं है। –

2

इस त्रुटि का मुख्य कारण यह है कि क्वेरी को निष्पादित करने से पहले क्वेरी को पार्स करना होता है।

ऐसा इसलिए होता है क्योंकि पूरा कोड एक बैच के रूप में निष्पादित किया जाता है। और SQL सर्वर को पार्स और निष्पादित करने का एक कार्य है।

यही कारण है कि GO कमांड (कोई कथन नहीं) आपको इस समस्या से बचने की अनुमति देता है। यह एक बैच के अंत संकेत करता है।

यहाँ इसके बारे में पढ़ने के लिए एक अच्छा विषय है: Understanding how SQL Server executes a query

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