Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 比较WHERE子句存储过程中的参数_Sql_Sql Server_Stored Procedures - Fatal编程技术网

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

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中没有“逗号分隔的值集”或“数组”数据类型。在代码中将参数作为标量变量处理。因此,当您在该列表中提供单个值

我有一个存储过程,它接收ItemId的列表。如果列表仅包含一项,则此操作有效:

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接收,请进一步解释。不要传递逗号分隔的列表,而是将列表中的每个参数作为行传递一个表值参数。