为一个 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 参数传递多个值的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询中的条件语句检查作为参数传递的多个值(列表)

使用ado.net将多个SQL表值参数传递到单个存储过程

向sql函数传递多个参数

mybati之parameterType传递多个参数

在 Reporting Services 中为单个参数传递多个值

如何在 jdbcTemplate 中为具有相同值的多个参数标记传递参数?