सेमी-कोलोन के साथ सीटीई क्यों शुरू होनी चाहिए?


14

मैं बस स्टैकऑवरफ्लो पर एक पोस्ट देख रहा था जहां हारून बर्ट्रेंड एक नंबर टेबल के बजाय एक सीटीई का उपयोग करने का प्रस्ताव करता है, जो हाथ में कार्य करने का एक सुंदर तरीका है। मेरा सवाल यह है कि सीटीई की पहली पंक्ति अर्ध-उपनिवेश से क्यों शुरू होती है?

;WITH n AS (SELECT TOP (10000) n FROM 
  (SELECT n = ROW_NUMBER() OVER
    (ORDER BY s1.[object_id])
    FROM sys.all_objects AS s1
    CROSS JOIN sys.all_objects AS s2
  ) AS x ORDER BY n
)
SELECT n FROM n ORDER BY n; -- look ma, no gaps!

क्या यह सुनिश्चित करने के लिए कि कथन को पिछले SELECTया कुछ में पार्स नहीं किया जाता है? मैं SQL Server 2005 BOL में कुछ भी नहीं देख रहा हूँ, इससे पहले एक अर्ध-बृहदान्त्र का उपयोग करने के बारे में।


जवाबों:


26

मैं हमेशा इसे यहां या स्टैकऑवरफ्लो पर पोस्ट करते समय करता हूं क्योंकि WITH- चूंकि कीवर्ड अतिभारित है - पिछले कमांड को एक समाप्ति अर्ध-कोलन की आवश्यकता है। यदि मैं एक कोड नमूना पेस्ट करता हूं जो CTE का उपयोग करता है, तो अनिवार्य रूप से कुछ उपयोगकर्ता इसे अपने मौजूदा कोड में पेस्ट करेंगे, और पिछले विवरण में अर्ध-बृहदान्त्र नहीं होगा। तो कोड टूट जाता है, और मुझे शिकायतें मिलती हैं:

आपका कोड टूट गया! मुझे यह त्रुटि संदेश मिला:

Incorrect syntax near 'WITH'...

हालांकि मैं यह मानना ​​चाहता हूं कि लोग एक अर्ध-उपनिवेश के साथ हमेशा अपने बयानों को समाप्त करने के बारे में बेहतर होते जा रहे हैं , मैं पहले से ही शोर-शराबा करना चाहता हूं और हमेशा इसे शामिल करता हूं। कुछ लोगों को यह पसंद नहीं है, लेकिन <shrug />। आप एक वैध विवरण के पहले या बाद में जितने चाहें उतने अर्ध-कॉलन शामिल कर सकते हैं। यह मान्य है:

;;;;SELECT 1;;;;;;;;;;;;SELECT 2;;;;;;;;SELECT 3;;;;;

तो वहाँ एक अतिरिक्त अर्ध-उपनिवेश होने से कोई नुकसान नहीं है जो एक बयान से पहले है कि परिभाषा से इसकी आवश्यकता है। यह ऐसा करने के लिए सुरक्षित है भले ही यह बहुत सुंदर नहीं है।

इस बिंदु को प्राप्त करने के लिए इसे अजीब तरह से शब्दबद्ध करना पड़ता है, लेकिन "सेमी-कोलोन के साथ एक वैध कथन को समाप्त नहीं करना" वास्तव में SQL Server 2008 के बाद से हटा दिया गया है। इसलिए जैसा कि मैं ब्लॉग पोस्ट में ऊपर वर्णित लिंक का वर्णन करता हूं, यहां तक ​​कि उन मामलों में भी जहां किसी त्रुटि को दरकिनार करने की आवश्यकता नहीं है, इसका उपयोग जहाँ भी मान्य हो, करना चाहिए। आप इसे यहाँ देख सकते हैं:

http://msdn.microsoft.com/en-us/library/ms143729.aspx

("अर्ध-उपनिवेश" के लिए अंतिम पृष्ठ खोजें)

यदि अपवाद नहीं होते तो बेशक यह SQL सर्वर नहीं होता। इसे इस्तेमाल करे:

BEGIN TRY;
  SELECT 1/1;
END TRY;
BEGIN CATCH;
  SELECT 1/1;
END CATCH;

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


1
2012 में भी मुझे एक ही त्रुटि संदेश मिला, लेकिन केवल अर्ध-बृहदान्त्र के कारण END TRY: i.stack.imgur.com/rc6dw.png - अगर मैं उस अर्ध- उपनिवेश को हटा दूं , तो सब कुछ काम करता है।
हारून बर्ट्रेंड

मुझे लगता है कि आप BEGIN CATCHकेवल एक अर्धविराम नहीं लगा सकते हैं क्योंकि यह एक एकल यौगिक विवरण के साथ पेश किया गया है BEGIN TRY। यह एक IFस्टेटमेंट से पहले अर्धविराम लगाने जैसा ही है ELSE
एंड्री एम

@AndriyM मैं यहाँ के नियमों के बारे में बहुत अधिक विस्तृत बातचीत के लिए निजता रखता हूँ। मैंने इसका उल्लेख किया क्योंकि यह हर किसी के लिए आश्चर्य की बात है जो इसके पार आता है, इसलिए नहीं कि मुझे इसका कारण समझ में नहीं आता है। :-)
हारून बर्ट्रेंड

10

यह सुनिश्चित करना है कि यह किसी भी पिछले बयान में शामिल नहीं है क्योंकि WITHटी-एसक्यूएल में विभिन्न प्रकार के उद्देश्यों को पूरा कर सकता है।

यदि यह बैच में पहला बयान है, तो मुझे नहीं लगता कि आपको इसकी आवश्यकता है।

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