Sql 比较WHERE子句存储过程中的参数
我有一个存储过程,它接收ItemId的列表。如果列表仅包含一项,则此操作有效:Sql 比较WHERE子句存储过程中的参数,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我有一个存储过程,它接收ItemId的列表。如果列表仅包含一项,则此操作有效: AND (@OrgItemIds = -1 OR ...) AND (@OrgItemIds = -1 AND...) 但是,如果列表包含多个项目,则会崩溃 有人知道怎么解决这个问题吗?我能查一下名单的大小吗? 或者我可以只检查列表的第一个元素,如@OrgItemIds[0]或类似的内容吗?SQL SERVER中没有“逗号分隔的值集”或“数组”数据类型。在代码中将参数作为标量变量处理。因此,当您在该列表中提供单个值
AND (@OrgItemIds = -1 OR ...)
AND (@OrgItemIds = -1 AND...)
但是,如果列表包含多个项目,则会崩溃
有人知道怎么解决这个问题吗?我能查一下名单的大小吗?
或者我可以只检查列表的第一个元素,如@OrgItemIds[0]或类似的内容吗?SQL SERVER中没有“逗号分隔的值集”或“数组”数据类型。在代码中将参数作为标量变量处理。因此,当您在该列表中提供单个值时,服务器会隐式地将其转换为int,您的sp就会成功。当您提供带有逗号的字符串时,将其转换为int是不可能的。您必须手动解析参数,将其放入表变量中,然后在WHERE子句中使用该表。或者更改此参数的处理方式以支持值字符串而不是标量值:
... where @OrgItemIds like '%,' + cast(t.OrgItemIds as varchar(10)) + ',%'
与按id或id列表过滤相比,哪一种性能更差。这是用于哪个RDBMS的?请添加一个标记来指定您使用的是
mysql
、postgresql
、sql-server
、oracle
还是db2
——或者其他完全不同的东西。我已经添加了sql-server
标记,如果列表作为relvar接收,那么只需加入它即可。如果未作为relvar接收,请进一步解释。不要传递逗号分隔的列表,而是将列表中的每个参数作为行传递一个表值参数。