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 inTableMainund 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] 
       )

Antworten auf die Frage(3)

Ihre Antwort auf die Frage