为了账号安全,请及时绑定邮箱和手机立即绑定

接受多个ID值的t-sql存储过程

接受多个ID值的t-sql存储过程

缥缈止盈 2019-06-19 15:51:21
接受多个ID值的t-sql存储过程是否有一种处理将ID列表作为参数传递给存储过程的优雅方法?例如,我希望存储过程返回部门1、2、5、7、20。在过去,我传递了一个逗号分隔的ID列表,就像下面的代码一样,但是我觉得这样做很脏。SQLServer 2005是我认为唯一适用的限制。create procedure getDepartments  @DepartmentIds varchar(max)as   declare @Sql varchar(max)        select @Sql = 'select [Name] from Department where DepartmentId in (' + @DepartmentIds + ')'   exec(@Sql)
查看完整描述

3 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超6个赞

是的,当前的解决方案容易受到SQL注入攻击。

我发现的最好的解决方案是使用一个将文本分解成文字的函数(这里有几个,或者您可以使用这是我博客里的)然后将其加入到您的桌子上。类似于:

SELECT d.[Name]FROM Department d    JOIN dbo.SplitWords(@DepartmentIds) w ON w.Value = d.DepartmentId


查看完整回答
反对 回复 2019-06-19
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

你可以使用XML。

例如:

declare @xmlstring as  varchar(100) set @xmlstring = '<args><arg value="42" /><arg2>-1</arg2></args>' declare @docid int 

exec sp_xml_preparedocument @docid output, @xmlstringselect  [id],parentid,nodetype,localname,[text]from    openxml(@docid, '/args', 1)

命令sp_xml_prearedocument是内置的。

这将产生产出:

id  parentid    nodetype    localname   text

0   NULL        1           args        NULL

2   0           1           arg         NULL

3   2           2           value       NULL

5   3           3           #text       42

4   0           1           arg2        NULL

6   4           3           #text       -1

哪个有(更多?)你需要的东西。


查看完整回答
反对 回复 2019-06-19
  • 3 回答
  • 0 关注
  • 479 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信