web-dev-qa-db-ja.com

SQL ServerはMySQL ON DUPLICATE KEY UPDATEのようなものを提供しますか

MySQLで ON DUPLICATE KEY UPDATE を指定し、UNIQUEインデックスまたはPRIMARY KEYに重複値を引き起こす行が挿入された場合、古い行の更新が実行されます。たとえば、列aがUNIQUEとして宣言され、値1を含む場合、次の2つのステートメントは同じ効果があります。

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

UPDATE table SET c=c+1 WHERE a=1;

T-SQLのようなものに出くわしたとは思わない。 SQL ServerはMySQLのON DUPLICATE KEY UPDATEに匹敵するものを提供しますか?

56
Ben Griswold

DUPLICATE KEY UPDATEに相当するものはありませんが、MERGEおよびWHEN MATCHEDが機能する場合があります

MERGEを使用したデータの挿入、更新、削除

44
michael pearson

このページの回答に実際のクエリの例が含まれていないことに驚いたので、ここに行きます:

データを挿入してから重複を処理するより複雑な例

MERGE
INTO MyBigDB.dbo.METER_DATA WITH (HOLDLOCK) AS target
USING (SELECT
    77748 AS rtu_id
   ,'12B096876' AS meter_id
   ,56112 AS meter_reading
   ,'20150602 00:20:11' AS local_time) AS source
(rtu_id, meter_id, meter_reading, time_local)
ON (target.rtu_id = source.rtu_id
  AND target.time_local = source.time_local)
WHEN MATCHED
  THEN UPDATE
      SET meter_id = '12B096876'
         ,meter_reading = 56112
WHEN NOT MATCHED
  THEN INSERT (rtu_id, meter_id, meter_reading, time_local)
      VALUES (77748, '12B096876', 56112, '20150602 00:20:11');
32
IvanD

SQL Server 2008には、TSQLの一部としてこの機能があります。
こちらのMERGEステートメントに関するドキュメントを参照してください- http://msdn.Microsoft.com/en-us/library/bb510625.aspx

3
shahkalpesh

SQL Server 2000以降では、トリガーの代わりに、必要な機能を実現できるという概念がありますが、舞台裏に厄介なトリガーが隠れています。

「挿入または更新しますか?」セクションを確認します

http://msdn.Microsoft.com/en-us/library/aa224818(SQL.80).aspx

1
Tetraneutron