4

我有一个 CheckBoxList,用户可以从列表中选择多个项目。然后我需要能够将这些值传递给我的存储过程,以便它们可以在 WHERE 条件下使用,例如:

WHERE ID IN (1,2,3)

我尝试这样做,以便它是一个 nvarchar 参数,我将字符串传递给1,2,3

WHERE ID IN (@IDs)

但这返回了以下错误:

Conversion failed when converting the nvarchar value '1,2,3' to data type int

任何帮助将非常感激!

4

3 回答 3

11

有几种方法可以做到。您可以将参数作为 XML blob 传递,如下例所示:

CREATE PROCEDURE [dbo].[uspGetCustomersXML]
    @CustomerIDs XML
AS
BEGIN
SELECT c.ID, c.Name
FROM [dbo].[Customer] c
JOIN @CustomerIDs.nodes('IDList/ID') AS x(Item) ON c.ID = Item.value('.', 'int' )
END
GO

--Example Use:
EXECUTE [dbo].[uspGetCustomersXML] '<IDList><ID>1</ID><ID>10</ID><ID>100</ID></IDList>'

或者将值作为 CSV 传递并使用拆分函数将值拆分为表变量(那里有很多拆分函数,快速搜索会抛出一个)。

CREATE PROCEDURE [dbo].[uspGetCustomersCSV]
    @CustomerIDs VARCHAR(8000)
AS
BEGIN
SELECT c.Id, c.Name
FROM [dbo].[Customer] c
JOIN dbo.fnSplit(@CustomerIDs, ',') t ON c.Id = t.item
END
GO

--Example Use:
EXECUTE [dbo].[uspGetCustomersCSV] '1,10,100'

如果您使用的是 SQL 2008 或更高版本,则可以使用表值参数,它允许您将 TABLE 变量作为参数传递。不久前,我在博客中介绍了这 3 种方法,并进行了快速的性能比较。

于 2011-01-07T10:18:05.803 回答
1
alter procedure c2
(@i varchar(5))
as
begin
    declare @sq nvarchar(4000)
    set @sq= 'select * from test where id in (<has_i>) '
    SET @sq= REPLACE(@sq, '<has_i>', @i)
    EXECUTE sp_executesql  @sq
end

exec c2 '1,3'
于 2011-05-26T12:57:25.080 回答
-1

我确实找到了类似问题的解决方案。它用于数据驱动的订阅,但可以轻松更改以用于参数。 在此处查看我的博客文章,并提供详细说明

如果您在将其转换为存储过程调用时遇到问题,请告诉我。

于 2013-07-17T13:03:25.393 回答