2016-10-29 12 views
1

最近、私はテーブルに対していくつかの変数の更新をしなければなりませんでしたが、私はMERGEステートメントを認識していますが(それに追いつく必要はありますが)、次のステートメントを実行して、これが「良いアイデア」であるか、私が気づいていない隠れた結果があるかどうかをチェックしたいと考えています。case文に基づくSQLの部分的なSQLの更新?

私の場合、プライマリキーをテーブルに渡しますが、渡されたパラメータがnullかどうかによって、カラムを更新します。強制的な更新(ステータスなど)次に、あなただけの上またはのいくつかの考えは、それがシナリオのMERGE文を追求するのが最善である

create procedure sp_myprocedure 
as 
    @id      bigint, 
    @field1     int = null, 
    @field2     varchar(255) = null, 
    @field3     char(1) = null 
begin 

    update my_table 
    set 
     field1 = case when @field1 is not null then @field1 else field1 end, 
     field2 = case when @field2 is not null then @field2 else field2 end, 
     field3 = case when @field3 is not null then @field3 else field3 end, 
    where 
     id = @id 

end 

直後。これは、型構造「THEN IF /」複数を持つ保存することです。..列を更新します上記のような?事前に

多くのおかげで、

答えて

1

それはきれいな方法で書くことができますが、これは結構です。

update my_table 
    set 
     field1 = coalesce (@field1,field1) 
    ,field2 = coalesce (@field2,field2) 
    ,field3 = coalesce (@field3,field3) 
    where 
     id = @id and coalesce(@field1,@field2,@field3) is not null 

またcoalesce(@field1,@field2,@field3) is not null

if coalesce(@field1,@field2,@field3) is not null 
begin 

    update my_table 
    set 
     field1 = coalesce (@field1,field1) 
    ,field2 = coalesce (@field2,field2) 
    ,field3 = coalesce (@field3,field3) 
    where 
     id = @id 

end 

ラッパーブロックにMERGE文はここでは関係ないです移動することができます。 INSERTUPDATEに又はがソース/ターゲットテーブルの同じマージ・キーを持つレコードの非存在/存在にレコードベースを削除した場合MERGEで
決定があります。
あなたの場合、それは常に更新です。

+0

乾杯、代替のおかげで。したがって合体はより効率的に見えるでしょうか?または合体機能はより「標準的」であるか? 私はどちらも理解の観点からはかなりうまく読んでいると思いますが、可能であれば、上記の方法の1つがより立っているかどうかを知りたがっていますか? –

+0

オプション2は、必要がない場合に更新ステートメントを実行しないので、優先されます。 –

+0

@onedaywhen、MERGEには条件付き更新の機能がありますか?このユースケースでは、MergeはUPDATEに対してあらゆる種類の利点(機能/パフォーマンス/構文)を持っていますか?いいえ、いいえ。 –

1
 create procedure sp_myprocedure 

     @id      bigint, 
     @field1     int = null, 
     @field2     varchar(255) = null, 
     @field3     char(1) = null 
     as 
     begin 
     IF coalesce(@field1,@field2,@field3) is not null 
      update dbo.my_table 
      set 
      field1 = coalesce (@field1,field1), 
      field2 = coalesce (@field2,field2), 
      field3 = coalesce (@field3,field3) 
      where id = @id 
     END 
1

@Dudu Markovitzによって答えへの対応:

MERGE文は、ここでは関係ありません。

私は同意しないと思いますが、MERGEはここでは完全に関連しています。単一テーブル値パラメータがあった場合(議論の余地として存在しなければならない、もちろん

MERGE my_table T 
    USING (VALUES (@id, @field1, @field2, @field3)) 
     AS S (id, field1, field2, field3) 
     ON T.id = S.id 
WHEN MATCHED THEN 
    UPDATE 
     SET field1 = COALESCE(S.field1, T.field1), 
      field2 = COALESCE(S.field2, T.field2), 
      field3 = COALESCE(S.field3, T.field3); 

アイデアは、ターゲット・テーブルを更新すると、パラメータ値を使用して、ソース表式を作成することです)、MERGEの関連性はさらに明らかです。

+0

それで、簡単なUPDATEステートメントに比べて利点はありません。あなたは、 'CTAS'、' DROP TABLE'、 'RENAME TABLE'を使って同じ結果が得られたと主張できました。 –

+0

おすすめの編集 –

関連する問題