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语言的语句中不包括大括号是一个坏主意,因此总是优先使用BEGIN和END.
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)
如果这是 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)
| 归档时间: |
|
| 查看次数: |
216564 次 |
| 最近记录: |