SQL Server (2008) 将 ArrayList 或字符串传递给 SP 用于 IN()

Posted

技术标签:

【中文标题】SQL Server (2008) 将 ArrayList 或字符串传递给 SP 用于 IN()【英文标题】:SQL Server (2008) Pass ArrayList or String to SP for IN() 【发布时间】:2010-10-05 21:47:10 【问题描述】:

我想知道如何将 ArrayList、List<int> 或 StringBuilder 逗号分隔列表传递给存储过程,以便使用 IN() 找到 ID 列表:

@myList varchar(50)

SELECT  *
FROM    tbl
WHERE   Id IN (@myList)

在 C# 中,我目前将列表构建为逗号分隔的字符串;但是,例如,当使用 nvarchar(50) 作为存储过程中参数的类型时 - 我收到一个错误,因为它无法将 '1,2,3' 转换为它在 IN() 之间期望的 int。

有什么想法吗?非常感激。 皮特

【问题讨论】:

【参考方案1】:

您可以使用用户定义的函数,例如

CREATE function [dbo].[csl_to_table] ( @list nvarchar(MAX) )
RETURNS @list_table TABLE ([id] INT)
AS
BEGIN
    DECLARE     @index INT,
            @start_index INT,
            @id INT

    SELECT @index = 1 
    SELECT @start_index = 1
    WHILE @index <= DATALENGTH(@list)
    BEGIN

        IF SUBSTRING(@list,@index,1) = ','
        BEGIN

            SELECT @id = CAST(SUBSTRING(@list, @start_index, @index - @start_index ) AS INT)
            INSERT @list_table ([id]) VALUES (@id)
            SELECT @start_index = @index + 1
        END
        SELECT @index  = @index + 1
    END
    SELECT @id = CAST(SUBSTRING(@list, @start_index, @index - @start_index ) AS INT)
    INSERT @list_table ([id]) VALUES (@id)
    RETURN
END

它接受一个 nvarchar 逗号分隔的 id 列表,并以整数形式返回这些 id 的表。然后,您可以像这样在存储过程中加入返回的表 -

DECLARE @passed_in_ids TABLE (id INT)

INSERT INTO @passed_in_ids (id)
  SELECT 
    id 
  FROM
    [dbo].[csl_to_table] (@your_passed_in_csl)

SELECT *
FROM 
myTable
INNER JOIN
@passed_in_ids ids
ON
myTable.id = ids.id

【讨论】:

我已将函数调用中的 id 放入一个表变量中,以防您需要在存储过程中的多个位置使用这些值,您只需调用该函数一次跨度> 【参考方案2】:

在 SQL 2008 中,有表值参数,可以作为解析 CSV 的友好替代方案;在这里查看example。

否则,另一种选择是 xml - SQL Server 中的xml 数据类型使您可以很容易地读取它(尽管它需要更多的传输字节)。

【讨论】:

以上是关于SQL Server (2008) 将 ArrayList 或字符串传递给 SP 用于 IN()的主要内容,如果未能解决你的问题,请参考以下文章

将 SQL Server 2008 降级到 SQL Server 2005

如何将所有数据库(快速)自 sql server 2008 express 传递到 sql server 2008 R2(无 express)

将 Codeigniter 3 与 MS SQL Server 连接

将数据库从 SQL Server 2012 转移到 SQL Server 2008 [关闭]

将SQL Server 2008的数据库迁移到SQL Server 2019

如何将 SQL Server 2008 R2 SSIS 包升级到 SQL Server 2016?