我正在尝试运行一个充满已创建表的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表。
任何人都知道这里有什么?
答案 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
声明中使用end
和if
。因此,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。