使用带有多个id的sqlcommand

时间:2013-11-27 17:46:33

标签: c# sql-server tsql sqlcommand sqlparameter

所以这很有效:

select name from users where id = @id

然而,这只选择1个人。假设我有3个ID,通常SQL看起来像这样(不使用参数)

select name from users where id in (4,6,9)

但是,当我写

时,它似乎不起作用
select name from users where id in (@IDs)

并在@ID中插入一个列表,如下所示

cmd.Parameters.AddWithValue("@IDs", userIDs);

有什么方法可以做我正在尝试的事情吗?重要的是要注意我正在调用的sql是(并且必须是)存储过程。

3 个答案:

答案 0 :(得分:2)

有两种方法可以做到这一点。第一种方法是将字符串传递给存储过程,然后将其添加到动态查询中:

-- @IDs  = '4,6,9'
DECLARE @MyQuery nvarchar(max) 
SET @MyQuery = N'SELECT name FROM users WHERE id IN (' + @IDs + ')'
EXEC(@MyQuery)

另一方面,如果您使用的是SQL Server 2008或更高版本,则可以使用表值参数(这是我的偏好)。

首先,创建一个用户定义的表类型:

CREATE TYPE IDList AS TABLE (
  id int
)

然后,使用用户定义的类型作为参数的类型:

DECLARE @IDs IDList 
INSERT INTO @IDs (ID) VALUES (4),(6),(9)
SELECT name FROM users u INNER JOIN @IDs i WHERE u.id = i.id  

如果您使用.NET来使用存储过程,则可以在MSDN上找到用户定义的SQL类型的示例代码。

答案 1 :(得分:0)

您可以在存储过程中创建动态SQL查询:

DECLARE @SQLQuery AS NVARCHAR(500)

SET @SQLQuery = 'select name from users where id in ( ' + @userIDs + ')'

EXECUTE(@SQLQuery)

为了防止SQL注入攻击,你必须小心并清理@userIDs的内容。

答案 2 :(得分:0)

在我们这边,我们使用iBatis.Net来管理它。执行查询听起来非常难看,但它仍然可以解决问题。

我们主要在SQL中使用字符串拆分。见[问题] How do I split a string so I can access item x?