所以这很有效:
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是(并且必须是)存储过程。
答案 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?