我有一个存储过程,其中我将产品类型 (prod_type) 作为参数最多传递四次。这些参数中的每一个都可能为空,在这种情况下它们应该被忽略。他们应该在每种产品类型之间有一个 OR 运算符,以便我们收集所有请求的产品类型。
如果可能的话,我想避免使用通过 sp_ExecuteSQL 传递的动态 SQL(我知道这很容易)。
下面是我正在尝试做的一个简化的、孤立的版本以供讨论:
CREATE TABLE #Products (Prod_ID int, prod_type int);
INSERT INTO #Products
SELECT 1, 2
UNION ALL
SELECT 2, 3
UNION ALL
SELECT 3, 3
UNION ALL
SELECT 4, 1
UNION ALL
SELECT 4, 5
DECLARE @prod_type1 as int;
DECLARE @prod_type2 as int;
DECLARE @prod_type3 as int;
DECLARE @prod_type4 as int;
SET @prod_type1 = NULL;
SET @prod_type2 = 2;
SET @prod_type3 = NULL;
SET @prod_type4 = 3;
Select * from #Products
WHERE ((prod_type = ISNULL(@prod_type1,prod_type))
OR (prod_type = ISNULL(@prod_type2,prod_type))
OR (prod_type = ISNULL(@prod_type3,prod_type)
OR (prod_type = ISNULL(@prod_type4,prod_type))))
我想被执行的地方是这样的:
Select * from [Product].[Product]
WHERE (prod_type = 2 OR prod_type = 3)
显然,上述使用 ISNULL 的解决方法将不起作用,因为 ISNULL 方法会将每行的产品类型与其自身进行比较,这将导致积极的“命中”。COALESCE 也会有同样的问题。
谁能提出一个不涉及使用 sp_ExecuteSQL 的解决方案?