我有一个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
非常感谢任何帮助!
答案 0 :(得分: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种方法,我blogged进行了一次快速的性能比较。
答案 1 :(得分: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'
答案 2 :(得分:-1)
我找到了类似问题的解决方案。 它用于数据驱动订阅,但可以轻松更改以用于参数。 check my blog post here with a detailed description
如果您在将其转换为存储过程调用时遇到问题,请告诉我。