2011-11-24 5 views
6

テーブルがあり、行を挿入したいとします。新しい行のキーは、すでにテーブルの既存の行のキーと一致している可能性があります。この場合、既存の行を更新します。または、テーブルに存在しない可能性があります。新しい行を挿入する必要があります。T-SQL単一の高速操作で更新/挿入を行うことは可能ですか

このような操作を実行する最も効率的な方法は何ですか?最初にSELECT(おそらくEXISTS)を実行して、特定のキーが存在するかどうかを確認してから、UPDATE(存在する場合)とINSERT(存在しない場合)を考えました。競合状態を避けるために、おそらくUPDLOCKHOLDLOCKをこのステートメントの組み合わせに保つ必要があります。これはあまりにも複雑で非効率的です。

SQL Server 2008 R2でこれを行うより効率的な方法があるのだろうかと思っていました。

答えて

10

SQL Server 2008以降には、まさにそのようなMERGEステートメントがあります。

詳細については、MSDN Books Online docs on MERGEを参照してください。

基本的に、あなたは4つのものが必要です。

  • ソース(表またはビューまたはインラインSELECT文)
  • ターゲット
  • は2
  • をリンク条件を登録しよう
  • MATCH(ソースとターゲットの両方に行が存在する)、NOT MATCHED(行がtarに存在しない場合まだ取得)など

ですから、基本的には何かを定義:

MERGE (targettable) AS t 
USING (sourcetable) AS s 
ON (JOIN condition between s and t) 
WHEN MATCHED THEN 
    UPDATE SET t.Col1 = s.Col1, t.Col2 = s.Col2 (etc.) 
WHEN NOT MATCHED THEN 
    INSERT(Col1, Col2, ..., ColN) VALUES(s.Col1, s.Col2, ......, s.ColN) 

これは、1つの文として行われ、非常にSQL Serverによって最適化されています。

+0

非常に良い回答、+1 ... –

関連する問題