我已经存储了必须传递参数的过程,但是问题是我不确定要传入多少个参数,它可以是1,在下次运行时可以是5。
cmd.Parameters.Add(new SqlParameter("@id", id)
任何人都可以帮助我如何在存储过程中传递这些数量可变的参数?谢谢
您可以将其作为逗号分隔的列表传递,然后使用拆分功能,然后对结果进行联接。
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():
STRING_SPLIT()
STRING_AGG()