2017-05-02 14 views
-1

私はマージする新たなんだ - 私は働くMERGE文を持っている:MERGE "Upsert"が挿入または更新されているかどうかを確認する方法?

merge customers with (holdlock) as c 
using (select @id as id) as new_id 
    on c.contactid = new_id.id 
when matched then 
    update set ContactID = 1, firstname = CAST(SYSDATETIME() AS VARCHAR(100)) 
when not matched then 
    insert(ContactID) values(1), firstName = 'b'; 

(SQLは本当に問題ではありません - これはテスト目的であった)

私の質問は - どのように私はできました挿入または更新が起こったかどうかを示す何かを返しますか?

+0

CreatedDateとModifiedDateのようにテーブルに2つの列を作成できます。挿入が行われたときのマージで、CreatedDate列にGetDate()を挿入します。更新が発生すると、GetDate()としてModifedDateが設定されます。 ModifedDate列がnullの場合は挿入のみが発生したことを意味し、値がある場合は更新されることを意味します。 – observer

+0

がありますが、これはスキーマの変更を必要としないため、下の回答が優れているようです。 – niico

+0

これらのdriveby原因不明のdownvotesを愛する必要があります。 – niico

答えて

3

マージステートメントのOUTPUT句をキーワード$ actionで使用できます。上記出力句は、アクションが返され

merge customers with (holdlock) as c 
using (select @id as id) as new_id 
    on c.contactid = new_id.id 
when matched then 
    update set ContactID = 1, firstname = CAST(SYSDATETIME() AS VARCHAR(100)) 
when not matched then 
    insert(ContactID) values(1), firstName = 'b' 

OUTPUT $action, inserted.*, deleted.*; 

何かなどが....挿入または削除、更新等の最初の列に採取した挿入と削除テーブルからの値。

+0

ありがとうございます - なぜ "挿入された*、削除された*" - それはなぜ "更新された*"なのでしょうか? – niico

+3

おい...グーグルそれhttp://www.made2mentor.com/2013/06/using-the-out-put-clause-with-t-sql-merge/ –

+0

あなたの答えの完全性のために/将来の参照itここにそれを持っているのが良いでしょう。あなたはそれをGoogleに提案して答えを編集しますか? – niico