【问题标题】:SQL Server (2008) Pass ArrayList or String to SP for IN()SQL Server (2008) 将 ArrayList 或字符串传递给 SP 用于 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。

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

【问题讨论】:

    标签: c# asp.net sql sql-server database


    【解决方案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 数据类型使您可以很容易地读取它(尽管它需要更多的传输字节)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-03
      相关资源
      最近更新 更多