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