To that end you would use the MERGE statement. Had you posted your table definitions and sample data as CREATE TABLE + INSERT, I would have shown how to do it with your data. But since I'm to lazy to figure that out from your post, here is just a generic example that you can work from:
CREATE TABLE data (key1 int NOT NULL,
key2 int NOT NULL,
somedata varchar(23) NULL,
somemoredata nvarchar(87) NULL,
CONSTRAINT pk_data PRIMARY KEY(key1, key2)
)
go
-- First set of data.
INSERT data (key1, key2, somedata, somemoredata)
VALUES(1, 1, 'This', 'That'),
(1, 2, 'Also this', 'Also that'),
(1, 3, 'This', 'But not that'),
(2, 1, NULL, 'Maybe')
go
SELECT * FROM data
go
-- A week later, new data comes in. Put it in a temp table
-- for the sake of the demo.
CREATE TABLE #newdata(key1 int NOT NULL,
key2 int NOT NULL,
somedata varchar(23) NULL,
somemoredata nvarchar(87) NULL,
PRIMARY KEY(key1, key2)
)
INSERT #newdata(key1, key2, somedata, somemoredata)
VALUES(1, 1, 'New', 'Also new'),
(1, 3, 'Not this', 'But that'),
(5, 5, 'Take', 'Five')
go
MERGE data d
USING #newdata n ON d.key1 = n.key1
AND d.key2 = n.key2
WHEN NOT MATCHED BY TARGET THEN
INSERT (key1, key2, somedata, somemoredata)
VALUES(n.key1, n.key2, n.somedata, n.somemoredata)
WHEN MATCHED THEN
UPDATE
SET somedata = n.somedata,
somemoredata = n.somemoredata
;
go
SELECT * FROM data
go
-- Cleanup
DROP TABLE #newdata
DROP TABLE data