Soru SQL “IF”, “BEGIN”, “END”, “END IF”?


Hiç bir SQL değil. Bir danışman yazdı aşağıdaki kodu var.

Birincisi, sadece bir ilkokulun seçildiğinden emin olur - o zaman, BEGIN'den sonra, @Term değişkeni 3'e eşitse, bu IF beyanı altındaki maddeleri yapmak isteriz. İşte problem. @ Tm = 3 olmadığı zaman, hala aşağıya inmek ve SECOND INSERT INTO @Classes parçasını yapmak istiyoruz. FYI - Çalışıyorken Süre = 3'tür, ancak her ikisi de INSERT'leri yapmaz - bu sadece "IF @Term = 3" bölümünün sonunda sadece bir SON SONU yerine bir END IF olması gerekir mi?

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

32
2017-12-31 21:07


Menşei


En içteki Begin-End bloğu içindeki kodu girmiştim, biraz yardımcı olabileceğini düşündüm. - MrBoJangles


Cevaplar:


SQL dili için normal form ile ilgili. IF beyanları, tanım gereği, sadece bir tek SQL deyimi. Ancak, çoklu SQL deyimleri, BEGIN-END bloğu içerebilen özel bir SQL deyimi vardır.

Başlangıç ​​bloğunu atlarsanız, SQL'iniz düzgün çalışır, ancak ilk ifadeyi yalnızca IF'nin bir parçası olarak yürütür.

Temel olarak, bu:

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

BEGIN-END bloğuyla aynı şeyle eşdeğerdir, çünkü sadece tek bir deyim yürütüyorsunuz. Bununla birlikte, aynı nedenden dolayı, C-tipi bir dilde bir if-cümlesi üzerinde kaşlı ayraçları içermemesi kötü bir fikirdir. her zaman BEGIN ve END kullanımı tercih edilir.


34
2017-12-31 21:19



Son derece yardımsever. - VSO


SQL'de ENDIF yok.

Doğrudan IF ifadesi, yalnızca if ifadesi doğruysa çalıştırılır.

BEGIN ... END yapısı, IF'den ayrıdır. Birden çok ifadeyi, tek bir ifade gibi ele alınabilecek bir blok olarak bir araya getirir. Bu nedenle BEGIN ... END, bir IF'den sonra doğrudan kullanılabilir ve bu nedenle BEGIN .... END dizisindeki tüm kod bloğu yürütülür veya atlanır.

Sizin durumunuzda ("daha fazla kod") şüpheliyim.


20
2017-12-31 21:18





El kapalı kod doğru görünüyor. Ya bir 'Else' kullanmayı denersen ve ne olduğunu görsen ne olur?

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

5
2017-12-31 21:20



Yine ben. "ELSE" ekleyemiyorum. Çünkü, her zaman 2. INSERT deyimini yapmak isterim.


Eğer bu MS Sql Server ise, o zaman neyin iyi çalışması gerekir? Aslında, teknik olarak, Başlama & Sona gerek yok, başlangıç ​​bloğunda sadece bir ifade var mı ... (Sanırım, @Classes bir tablo değişkenidir?)

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)

2
2017-12-31 21:12





Ayrıca iç içe geçmiş 'If' ifadesini tamamen kaldırmak için kodu yeniden yazabilirsiniz.

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) 

2
2017-12-31 22:17



İyi düşünmek. Bir sonraki mantık adımı, bunu bir UNION ALL seçimi ile bir inserte indirgemek olacaktır. - G Mastros


İlk eklenti ifadesinde bir hata meydana geldiğinde, @ ilasların içine ikinci kez yerleştirilmeleri gereken tek zaman yangıntır.

Eğer durum buysa, ikinci ifadenin bir geri dönüşü gerçekleştirmek için bir işleme ihtiyacınız varsa, ikinci ifadenin ilk OR'den önce çalışıp çalışmayacağına karar vermeniz gerekir.


1
2017-12-31 21:23





Doğru bir şekilde hatırlarsam ve daha sık yapmazsam ... Transact-Sql'de END IF desteği yoktur. BEGIN ve END işi yapmalıdır. Hataları mı alıyorsun?


0
2017-12-31 21:12