所以这很好用:
select name from users where id = @id不过,那只选了一个人。假设我有3个I,通常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是(而且必须是)一个存储过程。
发布于 2013-11-27 17:59:13
有两种方法可以做到这一点。第一个方法是将字符串传递给存储过程,然后将其添加到动态查询中:
-- @IDs = '4,6,9'
DECLARE @MyQuery nvarchar(max)
SET @MyQuery = N'SELECT name FROM users WHERE id IN (' + @IDs + ')'
EXEC(@MyQuery)另一方面,如果使用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类型的示例代码。
发布于 2013-11-27 17:54:23
可以在存储过程中创建动态SQL查询:
DECLARE @SQLQuery AS NVARCHAR(500)
SET @SQLQuery = 'select name from users where id in ( ' + @userIDs + ')'
EXECUTE(@SQLQuery)但是,您必须小心并净化@userID的内容,以防止SQL注入攻击。
发布于 2013-11-27 18:00:15
在我们这方面,我们正在使用iBatis.Net来管理这个问题。执行查询听起来很难看,但仍然有效。
我们主要是在SQL中使用字符串拆分。请参阅question
https://stackoverflow.com/questions/20249495
复制相似问题