SQL IF跳过下一个IF

时间:2014-01-02 16:17:43

标签: sql-server tsql if-statement union

我正在尝试运行一个充满已创建表的SQL,但只创建被调用的表。例如,当W进来时,我只想显示W表。如果S进来也是一样的。但是如果它以“W,S”形式出现,我希望创建两个表然后将它们组合在一起。 (对不起,如果我不能解释它好> _>)这是我到目前为止:

Declare @dept varchar = 'W,S'
Declare @tempW Table (Code int)
Declare @tempS Table (Code int)
Declare @num int

IF @dept LIKE '%W%'
        SET @num = 0
        While (@num <= 499)
        Begin
            Insert Into @tempW (Code)
            Values(@num)
            SET @num += 1
        END

IF @dept LIKE '%S%'
        SET @num = 500
        While (@num <= 599)
        Begin
            Insert Into @tempS (Code)
            Values(@num)
            SET @num += 1
        END

Select
    Code
From
    @tempW

UNION ALL

Select
    Code
From
    @tempS

所以基本上W表将填充数字0-499,S将填充500-599。但问题是,如果只是S或W通过,它工作正常。但是当'W,S'被传递时,它会填充W表,然后跳过S表并显示W表。

任何人都知道这里有什么?

2 个答案:

答案 0 :(得分:3)

您缺少来自IF的一些BEGIN和END语句:

    IF @dept LIKE '%W%'
    BEGIN
     SET @num = 0
     While (@num <= 499)
     Begin
        Insert Into @tempWine (Code)
        Values(@num)
        SET @num += 1
     END
    END

    IF @dept LIKE '%S%'
    BEGIN
     SET @num = 500
     While (@num <= 599)
     Begin
        Insert Into @tempSpirit (Code)
        Values(@num)
        SET @num += 1
     END
    END

从您的评论中,您看起来原来的问题是您没有使用长度声明您的varchar变量。它默认为1个字符的长度,其他所有内容都被截断。将其声明为如下所示:

Declare @dept VARCHAR(5) = 'W,S'

答案 1 :(得分:3)

您未在begin声明中使用endif。因此,set语句是唯一受if影响的行。你的循环总是运行。

IF @dept LIKE '%W%' begin -- encapsulate several statements
     SET @num = 0
     While (@num <= 499) Begin
         Insert Into @tempW (Code)
         Values(@num)
         SET @num += 1
     END
end

IF @dept LIKE '%S%' begin -- encapsulate several statements
    SET @num = 500
    While (@num <= 599) Begin
        Insert Into @tempS (Code) Values(@num)
        SET @num += 1
    END
end

编辑此外,更重要的是,您将@dept声明为varchar 而未指定长度。默认情况下,字符串长度为1。因此,它会将您的字符串截断为"W" ...并且您的第二个if条件从未得到满足。

declare @dept varchar(50) = 'W,S'

这是SQL Fiddle