从T-SQL参数列表中获取不同的值
我正在使用一个工具生成SQL查询,我需要使用多个参数筛选其中一个查询 查询与此类似:从T-SQL参数列表中获取不同的值,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,我正在使用一个工具生成SQL查询,我需要使用多个参数筛选其中一个查询 查询与此类似: Select * From Products Where (@ProductTypeIds is null or Product.ProductTypeId in (@ProductTypeIds)) 我知道上述查询在传统SQL上是不正确的,请继续阅读 本质上,我试图应用一个过滤器,如果没有为@ProductTypeIds参数传递任何内容,则不应用where条件 但是,当传递多个参数时,@ProductTy
Select *
From Products
Where (@ProductTypeIds is null or Product.ProductTypeId in (@ProductTypeIds))
我知道上述查询在传统SQL上是不正确的,请继续阅读
本质上,我试图应用一个过滤器,如果没有为@ProductTypeIds
参数传递任何内容,则不应用where条件
但是,当传递多个参数时,@ProductTypeIds
被工具转换为以下查询:
Select *
From Products
Where (@ProductTypeIds1, @ProductTypeIds2 is null or Product.ProductTypeId in (@ProductTypeIds1, @ProductTypeIds2))
这显然是一个无效的查询。因此,我认为我可以聪明地使用COALESCE
检查它们是否为空:
Select *
From Products
Where (COALESCE(@ProductTypeIds, null) is null or Product.ProductTypeId in (@ProductTypeIds))
此查询被正确翻译,但是,现在我使用的COALESCE
抛出了一个错误:
至少有一个要合并的参数必须是非空常量的表达式
我如何有效地检查@ProductTypeIds
(将被翻译成@ProductTypeIds1、@ProductTypeIds2
的)是否全部为空,以便应用筛选器或忽略
换言之,是否有一种方法可以Distinct
一组参数来检查最终结果是否为null
谢谢我不知道您的工具是如何工作的,但请尝试以下方法 不要检查
null
而是检查参数中永远不会出现的值,如:
WHERE COALESCE(@ProductTypeIds1, @ProductTypeIds2, -666) == -666 OR ...
我不知道你的工具是如何工作的,但是试试下面的方法 不要检查
null
而是检查参数中永远不会出现的值,如:
WHERE COALESCE(@ProductTypeIds1, @ProductTypeIds2, -666) == -666 OR ...
你如何传递
@ProductTypeIds
?这个变量的类型是什么?@Shnugo它是一个C#上的列表
,传递给Telerik Reports,在那里我没有Telerik Reports的经验(顺便说一句:这是一条你应该在问题中给出的信息…),但我假设这是一个声明的表变量或SQL Server中的类型?否则它不能与“logical in”一起使用,因为文档告诉…稍后将编写关于@ProductTypeIds1
(和…2,…3)它们是什么?好吧。你已经接受了一个答案。但是……你如何传递@ProductTypeIds
?这个变量的类型是什么?@Shnugo它是一个C#上的列表,传递给Telerik Reports,在那里我没有Telerik Reports的经验(顺便说一句:这是您应该在问题中提供的一条信息…),但我假设这是一个声明的表变量或SQL Server中的一个类型?否则它不能与“逻辑in”一起使用,因为文档告诉…稍后将写关于@ProductTypeIds1
(和…2,…3)它们是什么?好吧。你已经接受了一个答案。但是……太好了!这当然会起作用,现在我看它是如此明显!非常感谢。太好了!这当然会起作用,现在我看它是如此明显!非常感谢。