2016-04-13 7 views
0

シンプルで不満なシナリオがあります。SQL Server:条件付き列(出力スキーマの変更)

簡体

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テーブルにすべてのデータをダンプし、条件が満たされずにtempテーブルからすべてを選択するだけでその列を削除することもできます。

しかし、上記には他の意味がありますが、動的SQLはSQLが自分のプロシージャを最適化してキャッシュしないことを意味します。また、2番目の方法(#tempから不要なドロップ)は、使用されているかどうかにかかわらず検索されます。

2つの別々の選択肢を持つif文を使用することもできますが、SQLのポスト最適化では、procが実行されるたびに異なる実行パスが使用されるため理想的ではありません。

私の特定の要件の追加の列は、パフォーマンスに大きな影響を与えるむしろ課税計算です。したがって、必要な場合にのみパラメータを表示するために、ピボットテーブルを使用して追加列を結合します。

私はCTEとサブクエリを試してきました。

アドバイスはありますか?

答えて

0

謝罪私はこれを理解していなかったが、あなたは行うことができた場合:

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