有两个相同的表。动态参数将确定从两个表中的哪个表中获取数据。我采用的方法是合并两个表的结果,并向每个子查询添加一个谓词,以对传入的参数进行过滤(请参见下文)。这样就产生了一个估计的执行计划,该计划将读取两个表,然后应用过滤器。有没有一种方法可以优化查询而不使用条件(例如IF),以便仅查询适当的表?
create table Flip (ID uniqueidentifier)
create table Flop (ID uniqueidentifier)
查询
declare @useFlip bit
select * from Flip where @useFlip=1
union
select * from Flop where @useFlip<>1
执行计划
我个人将转到动态语句或IF...ELSE
逻辑。由于您只需要查询一个表,因此创建相关计划更为有意义。
动态方法:
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'SELECT * FROM ' + QUOTENAME(CASE @UseFlip WHEN 1 THEN N'Flip' ELSE N'Flop' END) + N';';
EXEC sp_executesql @SQL;
IF...ELSE
方法:
IF @UseFlip = 1
SELECT * FROM Flip;
ELSE
SELECT * FROM Flop;
编辑:上面的内容完全无效,因为OP在此答案下方进行了注释,以建议他们正在使用内联表值函数(此信息目前不在问题中)。这些语句均不能在iTVF中使用。