问题:
我希望WHERE子句的结束依赖于一个名为@filter的变量,该变量列出了许多整数值。例如,如果我想过滤值2和3,那么这将是WHERE子句的结束:
.
.
.
AND section.ID in (2,3)
但我还没有找到如何在这里使用@filter。如果我这样做:
declare @filter NVARCHAR(30) = 'sektion.resourceTypeID in (2,3)';
.
.
.
AND @filter
我收到错误消息" An expression of non-boolean type specified in a cotext where a condition is expected.
"如果我试试这个:
declare @filter NVARCHAR(30) = '2,3';
.
.
.
AND sektion.resourceTypeID in (@filter)
我可以运行查询,但收到错误消息,说明从NVARCHAR转换为INT失败。我该如何解决这个问题?
答案 0 :(得分:2)
您可以通过动态查询或重新思考方法来解决问题。
要使其动态化,您需要将最终的SQL语句构建为字符串,然后将@filter连接到它,然后执行它
declare @filter NVARCHAR(30) = '2,3';
declare @sql = 'YOUR SELECT HERE AND sektion.resourceTypeID in (' + @filter + ')'
EXEC(@sql)
沿着这些方向的东西。
或者,您可以在@filter = '2,3'
上执行拆分功能,并将其作为表变量/参数返回,并使用它加入查询而不是使用IN
这可以通过XML函数或其他类型的函数来完成。但是你必须编写一些额外的SQL脚本。
最后,您可能希望使用表值参数作为存储过程的输入,同样,您可以使用它来加入。
答案 1 :(得分:0)
如果由于某种原因你不能/不想要动态sql,那么另一种选择就是:
AND CHARINDEX(',' + cast(sektion.resourceTypeID AS nvarchar(20)) + ',',','+@filter+',') > 0