2013-11-27 27 views
0

所以这伟大的工程:使用SqlCommand时使用多个ID

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) 

工作,并插入一个列表到@IDs,像这样

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

有没有办法做我想做的事?请注意,我要调用的sql是(并且必须是)存储过程。

+0

您是否可以控制存储的proc? – AllenG

+0

它还没有制造,所以是的。 – Hejner

+1

您可以使用表值参数(http://msdn.microsoft.com/en-us/library/bb675163(v=vs.110).aspx) – meziantou

回答

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类型的示例代码。

+0

如果您通过'4,6,9'不会不起作用,因为它需要看起来像IN('4','6','9') – Tsukasa

+0

Tsukasa - 如果“ID”的数据类型是字符串,那么你会想('4','6','9');但如果你看看他的原始问题,这很清楚数据类型是int或其他数字类型,所以没有。 –

+0

啊,没错。错过了。 – Tsukasa

0

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

DECLARE @SQLQuery AS NVARCHAR(500) 

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

EXECUTE(@SQLQuery) 

你必须要小心,消毒@userIDs的内容虽然以防止SQL注入攻击。