SqlServerでSELECT条件によりInsertとUpdateを使う MERGE命令

SqlServerでSELECT条件によりInsertとUpdateを使い時がある

今まではSELECTで読み出して、条件によりInsertとUpdateを
コーディングしていたが2008からMERGE命令が使えるようになっている

下記がselectでINYMDとINNOを条件にしたUpdateとINSERTの例である
;が必須なので注意が必要

MERGE INTO GETANKA AA
  USING ( 
  SELECT A.inymd,a.inno,a.hkbn,a.cd,a.su as ksu
        ,a.su * isnull(b.tanka,0) as kin
   ,isnull(b.tanka,0) as tanka
  ,kbn= 20,a.su as SKG,skigo as ROT 
  FROM SAGYD2 A
  left join GETANKA20 B on(a.SGYMD = B.SGYMD AND A.SGNO = b.SGNO)
  WHERE a.SGYMD >= 20180901 And a.sgymd <= 20180930 
  ) BB  ON (AA.INYMD = BB.INYMD AND AA.INNO = BB.INNO) 
  WHEN MATCHED THEN 
     UPDATE SET KIN=BB,KIN
  WHEN NOT MATCHED THEN 
     insert  (INYMD,INNO,HKBN,CD,KSU,KIN,TANKA,KBN,SKG,ROT)
    VALUES (
    BB.INYMD,BB.INNO,BB.HKBN,BB.CD,BB.KSU,BB.KIN,BB.TANKA,BB.KBN,BB.SKG,BB.ROT
   );

なおSQLserverの古いバージョンからアップデートしたSQLserverは
互換性レベルを2008以上にする必要がある

マネージメントスタジオで
データベースを右クリック >>オプション>>互換性レベルを2008以上に
データベースの再起動が必要になる、再起動しないとインサートエラーになるSqlServerでSELECT条件によりInsertとUpdateを使う MERGE命令

カテゴリー sql