多个值未插入

时间:2011-11-18 15:42:02

标签: sql sql-server stored-procedures sql-server-2000

使用SQL Server 2000

我想根据部门

选择ID
ID 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

我的存储过程有什么问题?

需要存储过程帮助

2 个答案:

答案 0 :(得分:1)

首先,我不建议像这样构建动态SQL语句......它可能使您容易受到SQL注入攻击。如果你必须传入一个逗号分隔列表的字符串,我会改为解析该列表并将每个单独的值插入临时表。从那里,您可以加入临时表,而不是使用IN语句。

但是,问题在于您使用引号围绕逗号分隔列表,因此不是查找值H001D001F001 ...它正在寻找等于'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'