【问题标题】:Passing multiple values for one SQL parameter为一个 SQL 参数传递多个值
【发布时间】:2023-03-15 08:02:01
【问题描述】:

我有一个 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

任何帮助将不胜感激!

【问题讨论】:

标签: sql-server-2005 tsql checkboxlist where-in


【解决方案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]) 术语你有具体的代码吗?你能帮助我吗?抱歉,我是新手。
    猜你喜欢
    • 1970-01-01
    • 2013-10-26
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 2019-06-06
    • 2012-10-27
    • 2016-02-03
    相关资源
    最近更新 更多