Sql server SQL Server:条件列(输出架构更改)

Sql server SQL Server:条件列(输出架构更改),sql-server,tsql,schema,conditional,Sql Server,Tsql,Schema,Conditional,我有一个简单但令人沮丧的场景 简化 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,将其包装为一个

我有一个简单但令人沮丧的场景

简化

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,将其包装为一个字符串,并带有条件以确定是否应显示附加列

我还可以将所有数据转储到带有附加列的临时表中,如果不满足条件,只需删除该列,然后从临时表中选择all

然而,上面提到的还有其他含义,动态sql意味着sql不会像应该的那样优化和缓存我的过程,第二种方法是从temp中删除不需要的内容,这意味着对于每个记录,无论是否使用,都会检索额外的列

我也可以使用带有2个单独选择的if语句,但对于SQL后期优化来说,这并不理想,因为每次执行proc时都会使用不同的执行路径

我的特定需求中的附加列是一个相当繁重的计算,对我的性能有很大的影响,因此参数仅在需要时显示它们,它将使用透视表来连接附加列

我尝试过CTE和子查询,以及我能想到的几乎所有其他途径


有什么建议吗?

如果我不明白这一点,我深表歉意,但你能做到:

create procedure [dbo].[test] 
    @bShow bit = 0
as
begin
        SELECT name, surname, CASE WHEN @bShow = 0 THEN email ELSE NULL
        FROM table_person
end