一尘不染

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

sql

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

@myList varchar(50)

SELECT  *
FROM    tbl
WHERE   Id IN (@myList)

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

有任何想法吗?非常感激。
皮特


阅读 147

收藏
2021-05-05

共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列表,并以int形式返回这些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
2021-05-05