【发布时间】:2016-08-04 09:13:34
【问题描述】:
我有一个简单但令人沮丧的场景。
简化
create procedure [dbo].[test]
@bShow bit = 0
as
begin
if(@bShow = 0)
SELECT name, surname
FROM table_person
ELSE
SELECT name, surname, email
FROM table_person
end
我知道我可以使用动态 SQL,将其全部包装为带有条件的字符串,以确定是否应显示附加列。
我还可以将所有数据转储到带有附加列的#temp 表中,如果不满足条件,只需删除该列并从临时表中选择所有数据。
但是,上述内容还有其他含义,动态 sql 将意味着 SQL 不会像应有的那样优化和缓存我的过程,而第二种方法(从 #temp 中删除不需要的)意味着对于每条记录,附加列将无论是否使用都会被检索。
我也可以使用带有 2 个单独选择的 if 语句,但对于 SQL 后期优化,它并不理想,因为每次执行 proc 时都会使用不同的执行路径。
我的特定要求中的附加列是一个相当繁重的计算,对我的表现有很大影响,因此只有在需要时才显示它们的参数,它将使用数据透视表来连接附加列。
我已经尝试过 CTE 和子查询以及我能想到的几乎所有其他途径。
有什么建议吗?
【问题讨论】:
标签: sql-server tsql schema conditional