这是一个续集一定程度的慢检查存在的 。 Alex的建议可行,成功地避免了重复的代码,但我还是结束了第二个问题。 考虑下面的例子(从AlexKuznetsov)。 在这里面,我有两个分支处理1个contraint。 如果我有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
变化二: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