让SQL Server理解@参数计算为布尔值?

时间:2014-07-03 12:59:28

标签: sql sql-server

问题:

我希望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失败。我该如何解决这个问题?

2 个答案:

答案 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