2008-12-31 19 views
31

बिल्कुल एक एसक्यूएल व्यक्ति नहीं है। एक सलाहकार लिखा निम्नलिखित कोड है।एसक्यूएल "आईएफ", "BEGIN", "अंत", "अंत IF"?

सबसे पहले, यह सुनिश्चित करता है कि केवल एक प्राथमिक विद्यालय चुना गया है - फिर, BEGIN के बाद, यदि चर @Term 3 बराबर है तो हम उस IF कथन के तहत सामान करना चाहते हैं। यहाँ समस्या है। जब @ टर्म नहीं है = 3 हम अभी भी ड्रॉप करना चाहते हैं और @Classes भाग में दूसरा इन्टरनेट करना चाहते हैं। एफवाईआई - यह शब्द = 3 है जब यह चलाया जा रहा है, लेकिन यह INSERT दोनों नहीं कर रहा है - क्या केवल एक सादा अंत के बजाय "IF @Term = 3" अनुभाग के अंत में एक अंत हो सकता है?

IF @SchoolCategoryCode = 'Elem' 

--- We now have determined we are processing an elementary school... 

BEGIN 

---- Only do the following if the variable @Term equals a 3 - if it does not, skip just this first part 

    IF @Term = 3 

    BEGIN 

     INSERT INTO @Classes 

     SELECT  
     XXXXXX 
     FROM XXXX blah blah blah 

    END <----(Should this be ENDIF?) 

---- **always** "fall thru" to here, no matter what @Term is equal to - always do the following INSERT for all elementary schools 

    INSERT INTO @Classes  
    SELECT 
    XXXXXXXX  
    FROM XXXXXX (more code) 

END 
+0

मैं अंतरतम शुरू अंत ब्लॉक के अंदर कोड इंडेंट, सोचा था कि यह कुछ मदद कर सकता है। – MrBoJangles

उत्तर

2

यदि यह एमएस Sql सर्वर तो क्या तुम ठीक से काम करना चाहिए है ... वास्तव में, तकनीकी रूप से, आप डॉन टी सब पर शुरू & एंड, begin- में केवल एक ही बयान है snce की जरूरत अंत ब्लॉक ... (मुझे लगता है @Classes एक मेज चर रहा है?)

If @Term = 3 
    INSERT INTO @Classes 
    SELECT     XXXXXX 
    FROM XXXX blah blah blah 
-- ----------------------------- 

-- This next should always run, if the first code did not throw an exception... 
INSERT INTO @Classes  
SELECT XXXXXXXX   
FROM XXXXXX (more code) 
0

अगर मैं सही ढंग से याद है, और अधिक बार तो मैं नहीं ... वहाँ कोई अंत नहीं है Transact-SQL में समर्थन करते हैं। BEGIN और END को नौकरी करना चाहिए। क्या आपको त्रुटियां मिल रही हैं?

0

आप जो करना चाहते हैं उसके विवरण के आधार पर, कोड सही है जैसा लगता है। ENDIF मान्य SQL लूप नियंत्रण कीवर्ड नहीं है। क्या आप सुनिश्चित हैं कि INSERTS वास्तव में @ क्लास में डालने के लिए डेटा खींच रहे हैं? वास्तव में, अगर यह बुरा था तो यह नहीं चलेगा।

आप जो कुछ भी करना चाहते हैं वह वहां कुछ प्रिंट स्टेटमेंट डालना है। प्रत्येक पंक्ति के ऊपर एक प्रिंट डालें, यह दिखाने के लिए कि कुछ पंक्ति निष्पादित हो रही है, बस कुछ मूर्ख पाठ को आउटपुट कर रहा है। यदि आप दोनों आउटपुट प्राप्त करते हैं, तो आपका चयन ... INSERT ... संदेह है। आप प्रिंट के स्थान पर भी चयन कर सकते हैं (यानी, INSERT के बिना) और देखें कि वास्तव में कौन सा डेटा खींचा जा रहा है।

18

एसक्यूएल में कोई अंत नहीं है।

कथन सीधे एक आईएफ का पालन करता है केवल तभी निष्पादित होता है जब अभिव्यक्ति सही है।

BEGIN ... END निर्माण IF से अलग है। यह एक ब्लॉक के रूप में एक साथ कई कथन बांधता है जिसे माना जा सकता है जैसे वे एक ही कथन थे। इसलिए BEGIN ... END को सीधे IF के बाद उपयोग किया जा सकता है और इस प्रकार BEGIN में कोड का पूरा ब्लॉक .... END अनुक्रम या तो निष्पादित या छोड़ा जाएगा।

आपके मामले में मुझे संदेह है कि XXXXX से "(अधिक कोड)" आपकी समस्या है।

29

इसे SQL भाषा के लिए सामान्य फ़ॉर्म के साथ करना है। यदि कथन, परिभाषा के अनुसार, केवल एकल SQL कथन ले सकता है। हालांकि, एक विशेष प्रकार का SQL कथन है जिसमें एकाधिक SQL कथन, BEGIN-END ब्लॉक हो सकता है।

यदि आप स्टार्ट-एंड ब्लॉक को छोड़ देते हैं, तो आपका एसक्यूएल ठीक चल जाएगा, लेकिन यह केवल आईएफ के हिस्से के रूप में पहला कथन निष्पादित करेगा।

मूलतः, यह:

IF @Term = 3 
    INSERT INTO @Classes 
    SELECT    
     XXXXXX 
    FROM XXXX blah blah blah 

क्योंकि आप केवल एक ही बयान को क्रियान्वित कर रहे हैं, BEGIN-END ब्लॉक के साथ एक ही बात के बराबर है। हालांकि, इसी कारण से सी-जैसी भाषा में एक if-statement पर घुंघराले-ब्रेसिज़ को शामिल करना एक बुरा विचार नहीं है, यह हमेशा BEGIN और END का उपयोग करने के लिए बेहतर है।

+0

बेहद सहायक। – VSO

4

हाथ से कोड सही दिखता है। क्या होगा यदि आप 'अन्य' का उपयोग करने का प्रयास करें और देखें कि क्या होता है?

IF @SchoolCategoryCode = 'Elem' 

--- We now have determined we are processing an elementary school... 

BEGIN 

---- Only do the following if the variable @Term equals a 3 - if it does not, skip just this first part 

    IF @Term = 3 
    BEGIN 
     INSERT INTO @Classes 

     SELECT    
      XXXXXX 
     FROM XXXX blah blah blah 

     INSERT INTO @Classes  
     SELECT 
     XXXXXXXX  
     FROM XXXXXX (more code) 
    END <----(Should this be ENDIF?) 
    ELSE 
    BEGIN 


     INSERT INTO @Classes  
     SELECT 
     XXXXXXXX  
     FROM XXXXXX (more code) 
    END 
END 
+0

मुझे फिर से। मैं एक "ईएलएसई" नहीं जोड़ सकता। क्योंकि, मैं हमेशा दूसरा INSERT कथन करना चाहता हूं कि @Term = 3 –

1

एकमात्र बार @clases में डालने में विफल होना चाहिए, अगर पहले सम्मिलन कथन में कोई त्रुटि हुई है।

यदि ऐसा है, तो आपको यह तय करने की आवश्यकता है कि दूसरा कथन पहले से पहले चलाना चाहिए या यदि आपको रोलबैक करने के लिए लेनदेन की आवश्यकता है।

2

आप नेस्टेड 'अगर' कथन को पूरी तरह से हटाने के लिए कोड को फिर से लिख सकते हैं।

INSERT INTO @Classes  
SELECT XXXXXX  
FROM XXXX 
Where @Term = 3 

---- **always** "fall thru" to here, no matter what @Term is equal to - always do 
---- the following INSERT for all elementary schools  
INSERT INTO @Classes   
SELECT XXXXXXXX   
FROM XXXXXX (more code) 
+0

अच्छी सोच है या नहीं। अगला तर्क चरण यूनियन के सभी चयनों के साथ इसे एक सम्मिलित करने के लिए कम करना होगा। –

-9

सच कहूं यह कुछ ऐसा है अनुप्रयोग परत, डेटाबेस स्तर पर होना चाहिए की तरह लगता है ...

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