2011-11-18 49 views
2

使用SQL Server 2000多张值不插入

我想根据部门

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 ('''[email protected]+'''))' 
END 
ELSE 
BEGIN 
SELECT @SQL = @SQL+' (DEPARTMENT IN ('''[email protected]+'''))' 
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 

此存储过程正在为个人或选择ID所有部门,但它不适用于多个部门。

  • 如果我传递值存储过程All手段,它显示所有的ID该部门
  • 如果我选择H001手段,它是为H001部门显示的ID。
  • 如果我选择H001D001表示没有任何显示。

我将多个部门的值如H001,D001,F001传递给存储过程。但是存储过程没有为所选部门插入一个ID

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

需要存储过程的帮助

回答

1

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

然而,这里的问题是,你与周围的报价逗号分隔的列表,所以不是寻找值H001D001F001 ...它寻找到'H001', 'D001', 'F001'

等于一个值

要解决您的问题,你会改变你的SELECT语句:

SELECT @SQL = @SQL+' (DEPARTMENT IN ('[email protected]+'))' 

而当你在逗号分隔的列表传球,在T内部引号包裹每个单独的值他字符串是这样的:

编辑:从变量赋值改变为存储过程调用,使其更清楚我在暗示什么。

exec dbo.proc_Atnd1 '''H001'', ''D001'', ''F001''' 

东西解决这些类型的问题时显示有用的是PRINT的是,你所创建的SQL,然后检查,并确保它是做你的期望。

但是,我建议您不要采取这种方法,而是考虑解析列表并避免动态SQL。

+0

谢谢您的回复,我将使用逗号,而不是双引号或空格。现在我修改我的问题。 – Gopal

+0

你需要用双引号包裹每个值......'''' –

0

将您的值传递给多个部门,使用单引号而不是双引号。例如:

EXEC [dbo].[proc_Atnd1] 'H001'', ''D001'', ''F001' 
+0

我发现你已经稍微改变了这个问题。如果您选择另一个答案,我会抽出这个答案(Michael对SQL注入的建议很好)。我也看不到你的@Flag变量是如何被使用的,如果这个东西不包含循环或者把它作为参数。 –