一尘不染

具有可变数量的参数的存储过程

sql

我已经存储了必须传递参数的过程,但是问题是我不确定要传入多少个参数,它可以是1,在下次运行时可以是5。

cmd.Parameters.Add(new SqlParameter("@id", id)

任何人都可以帮助我如何在存储过程中传递这些数量可变的参数?谢谢


阅读 138

收藏
2021-03-17

共1个答案

一尘不染

您可以将其作为逗号分隔的列表传递,然后使用拆分功能,然后对结果进行联接。

CREATE FUNCTION dbo.SplitInts
(
   @List       VARCHAR(MAX),
   @Delimiter  CHAR(1)
)
RETURNS TABLE
AS
   RETURN 
   (
       SELECT Item = CONVERT(INT, Item)
       FROM
       (
           SELECT Item = x.i.value('(./text())[1]', 'INT')
           FROM
           (
               SELECT [XML] = CONVERT(XML, '<i>' 
                    + REPLACE(@List, @Delimiter, '</i><i>') 
                    + '</i>').query('.')
           ) AS a
           CROSS APPLY
           [XML].nodes('i') AS x(i)
       ) AS y
       WHERE Item IS NOT NULL
   );

现在,您的存储过程为:

CREATE PROCEDURE dbo.doStuff
    @List VARCHAR(MAX)
AS
BEGIN
    SET NOCOUNT ON;

    SELECT cols FROM dbo.table AS t
        INNER JOIN dbo.SplitInts(@List, ',') AS list
        ON t.ID = list.Item;
END
GO

然后调用它:

EXEC dbo.doStuff @List = '1, 2, 3, ...';

您可以在此处查看一些背景,其他选项和性能比较:

但是,在SQL Server
2016或更高版本上,您应该查看STRING_SPLIT()STRING_AGG()

2021-03-17