INSERT- oder UPDATE-Tabelle aus einer anderen Tabelle mit zusammengesetztem Primärschlüssel
Ich suche nach der richtigen Syntax und Möglichkeit, direkt aus SQL heraus Folgendes zu tun: Einfügen oder Aktualisieren (falls Daten darin bereits vorhanden sind)TableMain
aus Daten inTableA
wobei beide denselben zusammengesetzten Primärschlüssel haben.
Beide Tabellen sind definiert als:
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
wird regelmäßig gelöscht und gefüllt.
TableMain
als die gleiche Definition, aber wird viel mehr Zeilen von Daten enthalten und was ich brauche, ist, noch nie gesehene Werte von einzufügenTableA
inTableMain
und aktualisieren Sie bereits vorhandene Zeilen.
Früher habe ich diese Art von Einfügung durchgeführt, aber ich weiß nicht, wie ich mit Aktualisierungs- und zusammengesetzten Primärschlüsseln umgehen soll:
INSERT INTO TableMain
SELECT * FROM TableA
EDIT: Ich benutzeSQL Server 9.00.5000
EDIT: ein anderer Weg, inspiriert von MERGE undahme es nach
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]
)