×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
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以上に
データベースの再起動が必要になる、再起動しないとインサートエラーになる
PR
今までは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以上に
データベースの再起動が必要になる、再起動しないとインサートエラーになる