2017-01-03 2 views
7

SQL Serverでマージ更新クエリを実行しようとしています。マージ更新クエリで問題が発生しないように

テーブル "MY_TABLE" クエリは、次のようなある4列の "フィールド"(文字)、 "日付"(日付)、 "ヴァル"(数値)、 "改訂版"(日時)

があります

MERGE "my_table" AS Target USING (VALUES ('field_example','2017-01-04','0','2017-01-03 12:02:02')) AS Source ("field","date","val","revision") 
        ON (Target."field" = Source."field" AND Target."date" = Source."date") 
        WHEN MATCHED 
        THEN UPDATE SET Target."val" = Source."val",Target."revision" = Source."revision" 
        WHEN NOT MATCHED BY TARGET 
        THEN INSERT ("field","date","val","revision") 
        VALUES (Source."field", Source."date", Source."val", Source."revision") 
        OUTPUT $action, Inserted.*, Deleted.*; 

行がフィールド=「field_example」と日付=「2017年1月4日」と「MY_TABLE」に既に存在するので、私は改正」、2つの他の列「ヴァル」を更新するには、このクエリを期待しています"

私は次のクエリ出力を得る:私は、データベースに見たとき

$action   field  date   revision val   field.1  date.1   revision.1 val.1 
1 UPDATE field_example 2017-01-04 2017-01-03 12:02:02 0 field_example 2017-01-04 2017-01-03 10:09:25 161250 

だから、それは(それが必要のように更新しているために)良く見える

はしかし、行は=(更新されていませんvalはまだ0の代わりに161250ですが、改訂版はまだ2017-01-03 10:09:25です)

理由はありますか?私はデータベースに見えるしかし、行が更新されていない

+0

テーブルのサンプルデータを追加できますか? –

+0

ROLLBACKが存在しないか、revert文/トリガーがそこに存在することを望みます。 –

答えて

7

(= valは依然として161250代わりに0であり、リビジョンがまだ2017年1月3日10時09分25秒である )

何か考えてみませんか?

おそらく、異なるテーブル/データベースをクエリしているか、トランザクションがロールバックされている可能性があります。以下のスクリプトは、実際のデータ型を推測して、期待どおりに動作します。

CREATE TABLE dbo.my_table(
    "field" varchar(100) 
    ,"date" date 
    ,"val" int 
    ,"revision" datetime 
    ); 

INSERT INTO my_table ("field","date","val","revision") 
    VALUES ('field_example','2017-01-04','161250','2017-01-03 10:09:25'); 

MERGE "my_table" AS Target USING (VALUES ('field_example','2017-01-04','0','2017-01-03 12:02:02')) AS Source ("field","date","val","revision") 
    ON (Target."field" = Source."field" AND Target."date" = Source."date") 
    WHEN MATCHED THEN 
     UPDATE SET Target."val" = Source."val",Target."revision" = Source."revision" 
    WHEN NOT MATCHED BY TARGET THEN 
     INSERT ("field","date","val","revision") 
      VALUES (Source."field", Source."date", Source."val", Source."revision") 
    OUTPUT $action, Inserted.*, Deleted.*; 

SELECT "field","date","val","revision" 
FROM my_table; 
+1

私は、MERGEコマンドがロールバックされ、出力がまだ得られるものではないと考えています。 私は、ユーザが間違ったdb/tableをクエリすると仮定すると、より真実になる可能性が高いと思います。 PS:はい、マージは期待通りに機能しました。 –

+4

@AndreasVenieris、ロールバックに関する私の注意は、MERGEステートメントとそれに続くロールバックの前に明示的なトランザクションがあった場合にのみ適用されます。その場合、 'OUTPUT'節の(正しい)結果が返されます。 –

+0

申し訳ありません@ダン・グーズマン、私はあなたを取得します。はい、可能です。私はあなたが 'MERGE 'そのものを意味すると思った。誤解をおかけして申し訳ありません。 Mea culpa;) –

関連する問題