SQL"IF","BEGIN","END","END IF"?

40 sql

根本不是SQL人员.请顾问写下以下代码.

首先,它确保只选择了一所小学 - 然后,在BEGIN之后,如果变量@Term等于3,我们想在IF语句下做这些东西.这是问题所在.当@Term不是= 3时,我们仍然想要下拉并执行SECOND INSERT INTO @Classes部分.仅供参考 - 当运行时,Term = 3,但它不同时执行两个INSERT - 如果在"IF @Term = 3"部分的末尾有一个END IF,而不仅仅是一个简单的END?

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
Run Code Online (Sandbox Code Playgroud)

fox*_*rot 46

它与SQL语言的Normal Form有关.IF根据定义,语句只能采用 单个 SQL语句.但是,有一种特殊的SQL语句可以包含多个SQL语句,即BEGIN-END块.

如果省略该BEGIN-END块,则SQL将运行正常,但它只会执行第一个语句作为其中的一部分IF.

基本上,这个:

IF @Term = 3
    INSERT INTO @Classes
    SELECT              
        XXXXXX  
    FROM XXXX blah blah blah
Run Code Online (Sandbox Code Playgroud)

BEGIN-END块相同,因为您只执行一个语句.但是,出于同样的原因,IF在C语言的语句中不包括大括号是一个坏主意,因此总是优先使用BEGINEND.

  • 非常有帮助。 (2认同)

Ant*_*nes 24

SQL中没有ENDIF.

直接跟随IF的语句仅在if表达式为真时执行.

BEGIN ... END结构与IF分开.它将多个语句绑定在一起作为一个块,可以将它们视为单个语句.因此BEGIN ... END可以在IF之后直接使用,因此BEGIN .... END序列中的整个代码块将被执行或跳过.

在您的情况下,我怀疑FROM XXXXX之后的"(更多代码)"是您的问题所在.


Squ*_*eMe 11

手边代码看起来正确.如果您尝试使用'Else'并看看会发生什么怎么办?

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
Run Code Online (Sandbox Code Playgroud)


小智 5

您还可以重写代码以完全删除嵌套的“If”语句。

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) 
Run Code Online (Sandbox Code Playgroud)

  • 好想法。下一个逻辑步骤是使用 UNION ALL 选择将其减少为一次插入。 (2认同)

Cha*_*ana 3

如果这是 MS Sql Server 那么你所拥有的应该可以正常工作...事实上,从技术上讲,你根本不需要开始和结束,因为开始-结束块中只有一个语句...(我假设@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)
Run Code Online (Sandbox Code Playgroud)