比较WHERE子句存储过程中的参数

时间:2016-02-13 13:02:52

标签: sql sql-server stored-procedures

我有一个存储过程,它接收ItemId的列表。如果列表只包含一个项目:

AND (@OrgItemIds = -1 OR ...)
AND (@OrgItemIds = -1 AND...)

但如果列表中包含多个项目,则会崩溃。

有谁知道如何解决这个问题?我能以某种方式检查列表的大小吗? 或者我可以检查列表的第一个元素,如@OrgItemIds [0]或类似的东西?

1 个答案:

答案 0 :(得分:0)

没有"逗号分隔的值集"或"数组" SQL SERVER中的数据类型。您将参数作为代码中的标量变量处理。因此,当您在该列表中提供单个值时,服务器会隐式将其转换为int并且您的sp成功。
当您使用逗号提供字符串时 - 无法将其转换为int。

您必须手动解析您的参数,将其放入表变量,然后在WHERE子句中使用此表。或者更改此参数的处理以支持一串值而不是标量值:

... where @OrgItemIds like '%,' + cast(t.OrgItemIds as varchar(10)) + ',%'

这比性能或ID列表过滤要差得多。