SQL から直接次のことを行うための正しい構文と方法を探しています:同じ複合主キーを持つ両方にTableMain
含まれるデータからの挿入または更新 (データが既に存在する場合)。TableA
両方のテーブルは次のように定義されます。
CREATE TABLE TableA (
[TID0] [int] NOT NULL,
[TID1] [int] NOT NULL,
[language] [nvarchar](2) NOT NULL,
[TID2] [nvarchar](200) NOT NULL,
[text] [nvarchar](max) NULL,
[updatedOn] [datetime] NOT NULL DEFAULT (getdate())
PRIMARY KEY (
[TID0],
[TID1],
[language],
[TID2],
)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
TableA
定期的に削除され、埋められます。
TableMain
同じ定義ですが、さらに多くのデータ行が含まれます。必要なのは、見たことのない値をから挿入TableA
しTableMain
、既存の行を更新することです。
私はこの種の挿入を行っていましたが、更新と複合主キーの処理方法がわかりません:
INSERT INTO TableMain
SELECT * FROM TableA
編集:私はSQL Server 9.00.5000を使用しています
EDIT:MERGEに触発され、それを模倣する別の方法
DECLARE @updatedIDs TABLE(
[TID0] [int],
[TID1] [int],
[language] [nvarchar](2),
[TID2] [nvarchar](200),
PRIMARY KEY ([TID0], [TID1], [language], [TID2]) -- as stated by Nikola Markovinović above, thanks
);
-- First update records
update TableMain
set [text] = source.[text],
[updatedOn] = source.[updatedOn]
OUTPUT
inserted.[TID0]
inserted.[TID1]
inserted.[language]
inserted.[TID2]
INTO @updatedIDs
from
TableMain AS main
, TableA AS source
WHERE
TableMain.[TID0] = source.[TID0]
and TableMain.[TID1] = source.[TID1]
and TableMain.[language] = source.[language]
and TableMain.[TID2] = source.[TID2]
-- And then insert
insert into TableMain
select *
from TableA AS source
where not exists
(
select 1
from @updatedIDs AS i
where i.[TID0] = source.[TID0]
and i.[TID1] = source.[TID1]
and i.[language] = source.[language]
and i.[TID2] = source.[TID2]
)