具有可变参数数量的存储过程 [英] Stored procedure with variable number of parameters
问题描述
我有存储过程,我必须传递参数,但问题是我不确定要传入多少个参数,它可以是 1,下次运行它可以是 5.
I have stored procedure where I have to pass parameters, But the problem is I am not sure how many parameters is going to come it can be 1, in next run it can be 5.
cmd.Parameters.Add(new SqlParameter("@id", id)
谁能帮助我如何在存储过程中传递这些可变数量的参数?谢谢
Can anyone help how can I pass these variable number of parameters in stored procedure? Thanks
推荐答案
您可以将它作为逗号分隔的列表传入,然后使用 split 函数,并根据结果连接.
You could pass it in as a comma-separated list, then use a split function, and join against the results.
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, ...';
您可以在此处查看一些背景、其他选项和性能比较:
You can see some background, other options, and performance comparisons here:
- 以正确的方式拆分字符串 - 或次佳方式
- 拆分字符串:后续行动一个>
- 拆分字符串:现在使用更少的 T-SQL
- 比较字符串拆分/连接方法
- 处理整数列表:我的接近
- 拆分整数列表:另一个综述
- 更多关于拆分列表:自定义分隔符、防止重复和维护顺序
- 删除重复项来自 SQL Server 中的字符串
不过,在 SQL Server 2016 或更高版本上,您应该查看 STRING_SPLIT()
和 STRING_AGG()
:
On SQL Server 2016 or above, though, you should look at STRING_SPLIT()
and STRING_AGG()
:
- 性能惊喜和假设:STRING_SPLIT()
- STRING_SPLIT() 在 SQL Server 2016 中: 跟进#1
- STRING_SPLIT() 在 SQL Server 2016 中: 跟进#2
- SQL Server v.Next : STRING_AGG() 表现
- 用 SQL Server 的新 STRING_AGG 和 STRING_SPLIT 函数解决老问题
这篇关于具有可变参数数量的存储过程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!