首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ids命令和多个ids

使用ids命令和多个ids
EN

Stack Overflow用户
提问于 2013-11-27 17:46:33
回答 3查看 1.5K关注 0票数 0

所以这很好用:

代码语言:javascript
复制
select name from users where id = @id

不过,那只选了一个人。假设我有3个I,通常SQL看起来是这样的(不使用参数)

代码语言:javascript
复制
select name from users where id in (4,6,9)

但是,当我写的时候,它似乎不起作用

代码语言:javascript
复制
select name from users where id in (@IDs)

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

代码语言:javascript
复制
cmd.Parameters.AddWithValue("@IDs", userIDs);

有办法做我想做的事吗?需要注意的是,我正在调用的sql是(而且必须是)一个存储过程。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-27 17:59:13

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

代码语言:javascript
复制
-- @IDs  = '4,6,9'
DECLARE @MyQuery nvarchar(max) 
SET @MyQuery = N'SELECT name FROM users WHERE id IN (' + @IDs + ')'
EXEC(@MyQuery)

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

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

代码语言:javascript
复制
CREATE TYPE IDList AS TABLE (
  id int
)

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

代码语言:javascript
复制
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类型的示例代码。

票数 2
EN

Stack Overflow用户

发布于 2013-11-27 17:54:23

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

代码语言:javascript
复制
DECLARE @SQLQuery AS NVARCHAR(500)

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

EXECUTE(@SQLQuery)

但是,您必须小心并净化@userID的内容,以防止SQL注入攻击。

票数 0
EN

Stack Overflow用户

发布于 2013-11-27 18:00:15

在我们这方面,我们正在使用iBatis.Net来管理这个问题。执行查询听起来很难看,但仍然有效。

我们主要是在SQL中使用字符串拆分。请参阅question

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20249495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档