2016-08-07 15 views
10

समय-समय पर मैं SQL सर्वर स्टेटमेंट्स देखता हूं जो अर्धविराम ';' से शुरू होते हैं। की तरह नीचे';' टीएसक्यूएल स्टेटमेंट की शुरुआत में

;WITH cte 
    AS (SELECT ROW_NUMBER() OVER (PARTITION BY Col1, Col2, Col3 
             ORDER BY (SELECT 0)) RN 
     FROM #MyTable) 
DELETE FROM cte 
WHERE RN > 1 

अन्य उदाहरण ;THROW

है क्यों वास्तव में वहाँ है एक ';' TSQL बयान की शुरुआत

अद्यतन 1:

कृपया ध्यान दें कि मैं के बारे में पूछ रहा हूँ ';' बयान की शुरुआत में। इस सवाल का यह एक

When should I use semicolons in SQL Server?

अद्यतन 2 नकल नहीं है:

@MartinSmith जवाब समझ में आता है।

http://www.sommarskog.se/error_handling/Part1.html#jumpTHROW

इस बिंदु आप अपने आप से कह रहा हो सकता है पर:

बस यकीन है कि हम इस पोस्ट के लिए एक पूरा जवाब है बनाने के लिए, इस सम्मान लेख पर विचार वह मेरा पैर खींच किया जाना चाहिए , क्या माइक्रोसॉफ्ट वास्तव में कमांड को कॉल करता था; थ्रो? क्या यह सिर्फ THROW नहीं है? सच है, यदि आप पुस्तकें ऑनलाइन में देखते हैं, तो कोई अग्रणी अर्धविराम नहीं है। लेकिन अर्धविराम वहां होना चाहिए। आधिकारिक तौर पर, यह पिछले बयान के लिए टर्मिनेटर है, लेकिन यह वैकल्पिक है, और हर किसी से सेमीकॉलन का उपयोग उनके टी-एसक्यूएल स्टेटमेंट को समाप्त करने के लिए करता है।

मैं @ मार्टिनस्मिथ उत्तर से सहमत हूं, लेकिन ऐसा लगता है कि मामला कुछ चरम स्तर पर लिया जा रहा है।

आमतौर पर, एक संग्रहीत प्रक्रिया में THROW अपनी पंक्ति से एक बयान है। एसक्यूएल डेवलपर्स बस इस तरह एसक्यूएल लाइनों को मर्ज नहीं करते हैं और अर्धविराम से चूक जाते हैं।

मेरे लिए, वहाँ और मौका लोग गलती से मामले चरम और दुर्लभ कुछ तो होना ही उपर्युक्त उद्धरण से समझाया गया है TSQL

की एक और पंक्ति के साथ 'थ्रो' बयान मिश्रण से एक मेज ड्रॉप है? या मैं यहाँ एक बिंदु याद कर रहा हूँ?

उत्तर

13

यह बयान के बाद उनके सामने नहीं होना चाहिए। लेकिन ज्यादातर मामलों में टीएसक्यूएल में कथन पर समाप्ति अर्ध कोलन वर्तमान में अभ्यास में वैकल्पिक हैं (हालांकि तकनीकी रूप से Not ending Transact-SQL statements with a semicolon को बहिष्कृत किया गया है) और सेमी कॉलन को समाप्त करने वाले बयान की उपस्थिति लागू नहीं की जाती है।

एक अपवाद MERGE बयान (कि एक को समाप्त अर्ध बृहदान्त्र जाना पड़ता है) और यह भी बयान WITH या THROW

पूर्ववर्ती तो इस मामले ओपी में StackOverflow पर जवाब (या भविष्य पाठकों) के लिए कुछ हद तक एक रक्षात्मक अभ्यास है इसे किसी मौजूदा बैच के बीच में चिपकाता है जिसमें पिछले कथन पर आवश्यक अर्ध कोलन नहीं होता है और फिर शिकायत करता है कि यह काम नहीं करता है और उन्हें निम्न त्रुटि प्राप्त होती है।

कीवर्ड 'के साथ' के भीतर गलत वाक्यविन्यास। यदि यह कथन सामान्य तालिका अभिव्यक्ति है, तो xmlnamespaces खंड या परिवर्तन ट्रैकिंग संदर्भ खंड, पिछले कथन को अर्धविराम से समाप्त किया जाना चाहिए।

मामले कि पूर्ववर्ती बयान अर्धविराम अतिरिक्त एक कोई नुकसान नहीं करता है के साथ समाप्त होता है में

। इसे सिर्फ खाली कथन के रूप में माना जाता है।

यह अभ्यास स्वयं समस्याएं पैदा कर सकता है, हालांकि सीटीई का संदर्भ उस संदर्भ में किया जाता है जहां बहु स्टेटमेंट मान्य नहीं होते हैं। जैसे WITH से पहले अर्धविराम डालने से इसे तोड़ दिया जाएगा।

CREATE VIEW V1 
AS 
    WITH T(X) 
     AS (SELECT 1) 
    SELECT * 
    FROM T; 

इसी THROW के लिए आँख बंद करके एक अग्रणी अर्द्ध बृहदान्त्र डालने भी समस्याएं पैदा कर सकता।

IF @i IS NULL 
;THROW 50000, '@i IS NULL', 1; 

गलत पास वाक्य रचना ';'।

मैं the example you give in your question तय की और

; 

--Ensure that any immediately preceding statement is terminated with a semicolon above 
WITH cte 
    AS (SELECT ROW_NUMBER() OVER (PARTITION BY Col1, Col2, Col3 
             ORDER BY (SELECT 0)) RN 
     FROM #MyTable) 
DELETE FROM cte 
WHERE RN > 1; 
+0

यहां सहायता के लिए धन्यवाद। क्या आप मेरी अपडेट की गई टिप्पणियों पर अपना साझा करने में सक्षम होंगे? –

+0

@AllanXu - हाँ मैं आपकी भावनाओं से सहमत हूं; थ्रोव - यह अभ्यास केवल कुछ है जो मैं वेब पर कोड नमूने के लिए विचार करता हूं। मेरे अपने स्रोत कोड में कुछ नहीं। जैसा कि सही काम करना है यह सुनिश्चित करने के लिए कि आप अर्ध कोलन के साथ पिछले बयान (और आदर्श रूप से सभी कथन) को समाप्त कर दें। –

2

में बदल यह लगता है कि यह पार्सर क्या कोड करने के लिए माना जाता है यह पता लगाने की एक लड़ाई मौका देने के बारे में है है।

throw एक आरक्षित कीवर्ड नहीं है और with अन्य कथनों के भाग के रूप में उपयोग किया जा सकता है।

Transact-SQL में पूरी तरह से वैध बयान:

create table throw 
(
    ID int 
) 
with(data_compression = none) 

ध्यान दें कि लाइन टूट जाता है कुछ पार्सर एक-दूसरे बयान को अलग करने का उपयोग करता है नहीं है।

create 
table 
throw(ID int) 
with (data_compression = none) insert into 
throw values(1) select 
* from throw 

यह किसी अन्य प्रकार के जादू का उपयोग करता है यह पता लगाने के लिए कि आप वास्तव में इसका मतलब है।

create table throw(ID int) 
with (data_compression = none); 

insert into throw values(1); 

select * 
from throw; 

तो, चीजों को आसान जब CTE के SQL सर्वर 2005 में शुरू की गई थी और जब फेंक एसक्यूएल सर्वर 2012 में जोड़ा गया है यह आवश्यक है कि पूर्ववर्ती बयान एक स्टेटमेंट टर्मिनेटर साथ समाप्त होता है बनाने के लिए।

मर्ज स्टेटमेंट के अंत में ; की आवश्यकता के लिए वही कारण।

declare @T table(ID int, Value int); 

merge into @T as T 
using (values(1, 100)) as S(ID, Value) 
on T.ID = S.ID 
when matched then 
    update set Value = S.Value 
when not matched then 
    insert (ID, Value) values(S.ID, S.Value); 

कोड को पार्स करने के लिए आसान है और देखें कि कथन वास्तव में कहां समाप्त होता है।

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