为一个 SQL 参数传递多个值
Posted
技术标签:
【中文标题】为一个 SQL 参数传递多个值【英文标题】:Passing multiple values for one SQL parameter 【发布时间】:2011-06-05 04:40:38 【问题描述】:我有一个 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
任何帮助将不胜感激!
【问题讨论】:
见***.com/questions/878833/…(或使用位掩码) 【参考方案1】:我确实找到了类似问题的解决方案。 它用于数据驱动的订阅,但可以轻松更改以用于参数。 check my blog post here with a detailed description
如果您在将其转换为存储过程调用时遇到问题,请告诉我。
【讨论】:
你能扩展一下你的答案吗?如果链接断开,仅链接附近的答案将无用。 对不起,我来晚了.....我会将博文转换为单独的回复。整个故事:博文仍然有效! 这是一篇相当长的博文,它仍然在线(并且会持续一段时间) 我创建了一个非常简单的表,名称为 tmpMultiSel,包含两列(ID 和名称) 这是我为使其成为“多值”所做的: 1. 创建一个函数 我确实找到了一个接受两个参数并将分隔字符串(第一个参数)拆分为临时表的函数。我找到了它codeproject.com/Articles/7938/…,但将名称修改为我的“习惯”_f_ParseText2Table 如果我们测试这个函数,它的工作原理是这样的:【参考方案2】: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'
【讨论】:
【参考方案3】:有几种方法可以做到这一点。 您可以像以下示例一样将参数作为 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 变量作为参数传递。不久前,我 blogged 关于这 3 种方法,并进行了快速的性能比较。
【讨论】:
谢谢。我使用了 WHERE IN (SELECT [values from XML]) 子句来获得结果,但以前从未知道这是可能的。干杯! @Curt 如何在WHERE IN (SELECT [values from XML])
中使用[values from XML])
术语你有具体的代码吗?你能帮助我吗?抱歉,我是新手。以上是关于为一个 SQL 参数传递多个值的主要内容,如果未能解决你的问题,请参考以下文章