从T-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

我正在使用一个工具生成SQL查询,我需要使用多个参数筛选其中一个查询

查询与此类似:

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)它们是什么?好吧。你已经接受了一个答案。但是……太好了!这当然会起作用,现在我看它是如此明显!非常感谢。太好了!这当然会起作用,现在我看它是如此明显!非常感谢。