是否有一种优雅的方式来处理将 id 列表作为参数传递给存储过程?
例如,我希望存储过程返回部门 1、2、5、7、20。过去,我传递了一个逗号分隔的 id 列表,如下面的代码,但感觉这样做真的很脏。
我认为 SQL Server 2005 是我唯一适用的限制。
create procedure getDepartments
@DepartmentIds varchar(max)
as
declare @Sql varchar(max)
select @Sql = 'select [Name] from Department where DepartmentId in (' + @DepartmentIds + ')'
exec(@Sql)
最佳答案
Erland Sommarskog 在过去 16 年里一直保持着这个问题的权威答案: Arrays and Lists in SQL Server 。
至少有十几种方法可以将数组或列表传递给查询;每个都有自己独特的优点和缺点。
- Table-Valued Parameters 。仅适用于 SQL Server 2008 及更高版本,并且可能是最接近通用“最佳”方法。
- The Iterative Method 。传递一个分隔字符串并循环遍历它。
- Using the CLR 。仅来自 .NET 语言的 SQL Server 2005 及更高版本。
- XML 。非常适合插入多行;对于 SELECT 来说可能有点过分了。
- Table of Numbers 。比简单的迭代方法具有更高的性能/复杂性。
- Fixed-length Elements 。固定长度提高了分隔字符串的速度
- Function of Numbers 。数字表和固定长度的变体,其中数字在函数中生成,而不是从表中获取。
- Recursive Common Table Expression (热膨胀系数)。 SQL Server 2005及更高版本,仍然不太复杂,并且比迭代方法性能更高。
- Dynamic SQL 。可能会很慢并且有安全隐患。
- 将列表传递为 Many Parameters 。乏味且容易出错,但很简单。
- Really Slow Methods 。使用 charindex、patindex 或 LIKE 的方法。
我真的无法推荐足够的read the article了解所有这些选项之间的权衡。
关于sql-server - 接受多个 Id 值的 T-SQL 存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43249/