根本不是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
foxxtrot.. 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
与BEGIN-END
块相同,因为您只执行一个语句.但是,出于同样的原因,IF
在C语言的语句中不包括大括号是一个坏主意,因此总是优先使用BEGIN
和END
.
它与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
与BEGIN-END
块相同,因为您只执行一个语句.但是,出于同样的原因,IF
在C语言的语句中不包括大括号是一个坏主意,因此总是优先使用BEGIN
和END
.
SQL中没有ENDIF.
直接跟随IF的语句仅在if表达式为真时执行.
BEGIN ... END结构与IF分开.它将多个语句绑定在一起作为一个块,可以将它们视为单个语句.因此BEGIN ... END可以在IF之后直接使用,因此BEGIN .... END序列中的整个代码块将被执行或跳过.
在您的情况下,我怀疑FROM XXXXX之后的"(更多代码)"是您的问题所在.
手边代码看起来正确.如果您尝试使用'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