sql-server - 接受多个 Id 值的 T-SQL 存储过程

标签 sql-server tsql stored-procedures

是否有一种优雅的方式来处理将 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/

相关文章:

sql-server - sql server 删除速度因索引而大幅减慢

sql-server - 非分区表的 sys.partition 中的多个记录

sql-server - Django:无法连接到 Microsoft SQL Server

sql - T-SQL CASE 多个条件相同结果

sql-server - 游标循环内的表变量

mysql - 在 MySQL 中创建存储过程时出现问题

java - 由于 SSL 问题,无法使用 JDBC 连接到 Azure(基于连接字符串和提供的示例)

sql - 来自不同数据库的表上的外键

sql - 选择记录等于 y 但不等于 x 的用户

mysql - 存储过程从动态sql创建存储过程