在Where子句中有效处理多个可选约束

Bri*_*ian 1 t-sql sql-server-2005

这有点像Slow Exists Check的续集.亚历克斯的建议有效,并成功避免了代码重复,但我仍然得到了第二个问题.考虑下面的例子(来自AlexKuznetsov).在其中,我有两个分支处理1个约束.如果我有2个可选约束,我最终会得到4个分支.基本上,分支数量随着约束的数量呈指数增长.

另一方面,如果我使用多语句表值函数或以其他方式使用临时表,SQL查询优化器无法帮助我,因此事情变得缓慢.我有点不信任动态SQL(我听说它也很慢).

任何人都可以提供有关如何添加更多约束而不添加大量if语句的建议吗?

注意:我之前尝试过只是链接x is null or inpo = @inpo在一起,但这很慢.请记住,虽然inpo = @inpo可以通过某种索引黑魔法处理测试,但最终会对表中的每一行评估无效测试.

IF @inpo IS NULL BEGIN
  SELECT a,b,c 
    FROM dbo.ReuseMyQuery(@i1)
    ORDER BY c;
END ELSE BEGIN
  SELECT a,b,c 
    FROM dbo.ReuseMyQuery(@i1)
    WHERE inpo = @inpo
    ORDER BY c;
END
Run Code Online (Sandbox Code Playgroud)

变化二:2个约束:

IF @inpo IS NULL BEGIN      
    IF @inpo2 IS NULL BEGIN
        SELECT a,b,c 
        FROM dbo.ReuseMyQuery(@i1)
        ORDER BY c;
    END ELSE BEGIN
        SELECT a,b,c 
        FROM dbo.ReuseMyQuery(@i1)
        WHERE inpo2 = @inpo2
        ORDER BY c;
    END
END ELSE BEGIN
    IF @inpo2 IS NULL BEGIN
        SELECT a,b,c 
        FROM dbo.ReuseMyQuery(@i1)
        WHERE inpo = @inpo
        ORDER BY c;
    END ELSE BEGIN
        SELECT a,b,c 
        FROM dbo.ReuseMyQuery(@i1)
        WHERE inpo = @inpo AND
              inpo2 = @inpo2
        ORDER BY c;
    END
END
Run Code Online (Sandbox Code Playgroud)