Jas*_*onS 144 t-sql sql-server 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)
Por*_*man 232
Erland Sommarskog在过去的16年里一直保持对这个问题的权威答案:SQL Server中的数组和列表.
至少有十几种方法可以将数组或列表传递给查询; 每个人都有自己独特的优点和缺点.
我真的不能建议阅读这篇文章来了解所有这些选项之间的权衡.
Mat*_*ton 11
是的,您当前的解决方案容易受到SQL注入攻击.
我发现的最好的解决方案是使用一个将文本分成单词的功能(这里有一些发布,或者你可以在我的博客中使用这个),然后将其加入到你的表中.就像是:
SELECT d.[Name]
FROM Department d
    JOIN dbo.SplitWords(@DepartmentIds) w ON w.Value = d.DepartmentId