使用SQL Server 2000
我想根据部门
选择IDID Department
001 H001
002 F001
003 S001
004 D001
存储过程
ALTER PROC [dbo].[proc_Atnd1]
@Dep VARCHAR(100)
AS
BEGIN
DECLARE @SQL VARCHAR(1000)
DECLARE @Flag INT
SELECT @Flag=0
SELECT @SQL = 'SELECT ID FROM Table1 WHERE '
IF @Dep <>'All'
BEGIN
IF @Flag=1
BEGIN
SELECT @SQL = @SQL+' AND (DEPARTMENT IN ('''+@Dep+'''))'
END
ELSE
BEGIN
SELECT @SQL = @SQL+' (DEPARTMENT IN ('''+@Dep+'''))'
SELECT @Flag=1
END
END
if @SQL = 'SELECT ID FROM Table1 WHERE ' SELECT @SQL = 'SELECT ID FROM Table1'
Delete from tb_Sample
INSERT INTO tb_Sample EXEC(@SQL)
end
此存储过程适用于个别或所有部门,但不适用于多个部门。
All
,则表示它显示该部门的所有ID H001
表示,它会显示H001
部门的ID。H001
并且D001
表示没有显示任何内容。我将多个部门(例如此H001,D001,F001
)的值传递给存储过程。但存储过程未插入所选部门的ID
我的存储过程有什么问题?
需要存储过程帮助
答案 0 :(得分:1)
首先,我不建议像这样构建动态SQL语句......它可能使您容易受到SQL注入攻击。如果你必须传入一个逗号分隔列表的字符串,我会改为解析该列表并将每个单独的值插入临时表。从那里,您可以加入临时表,而不是使用IN
语句。
但是,问题在于您使用引号围绕逗号分隔列表,因此不是查找值H001
,D001
和F001
...它正在寻找等于'H001', 'D001', 'F001'
要解决您的问题,您可以将select语句更改为:
SELECT @SQL = @SQL+' (DEPARTMENT IN ('+@Dep+'))'
当你传入以逗号分隔的列表时,将每个单独的值用字符串中的引号括起来,如下所示:
编辑:从变量赋值更改为存储过程调用,以使其更清楚我的建议。
exec dbo.proc_Atnd1 '''H001'', ''D001'', ''F001'''
在对这些类型的问题进行故障排除时有用的一点是PRINT
输出您创建的SQL,然后检查它并确保它正在按预期执行。
但是,我建议您不要采用这种方法,而是考虑解析列表并避免使用动态SQL。
答案 1 :(得分:0)
为具有转义单引号的多个部门传递您的值,而不是双引号。例如:
EXEC [dbo].[proc_Atnd1] 'H001'', ''D001'', ''F001'