我有一个表tblstars_new,每周从客户端更新一次。我有另一个表,tblstars,它需要从tblstars_new导入新的和更新的数据。
在tblstars_new中查找tblstars中不存在的行,然后将其添加到tblstars很简单。
但是,我还需要在tblstars_new中找到PandA_Code列已更改的行,然后更新tblstars中的相同行。
此查询告诉我来自tblstars_new的哪些行的PandA_Code已更改并需要在tblstars中更新。
SELECT
sn.*
FROM
tblstars_new sn
JOIN tblstars s ON sn.Student_ID_Number = s.Student_ID_Number AND sn.PandA_Code != s.PandA_Code
我正在试图找出一个可以进行更改的MERGE语句。正如我在Prod所做的那样,我无法真正玩耍。两个问题:
1)是否可以在不实际进行更改的情况下查看更改?
2)下面的MERGE语句是否正确?
BEGIN TRAN;
MERGE tblstars AS T -- Target
USING tblstars_new AS S -- Source
ON
(T.Student_ID_Number = S.Student_ID_Number AND T.PandA_Code != S.PandA_Code)
WHEN NOT MATCHED BY TARGET
THEN
UPDATE SET T.PandA_Code = S.PandA_Code
OUTPUT $action;
ROLLBACK TRAN;
GO
答案 0 :(得分:2)
以下是满足您请求的MERGE
查询。
BEGIN TRAN;
MERGE tblstars AS T -- Target
USING tblstars_new AS S -- Source
ON T.Student_ID_Number = S.Student_ID_Number -- They shoudl match by PK
WHEN MATCHED AND AND T.PandA_Code != S.PandA_Code
THEN -- when matched and PandA_Code different update them
UPDATE SET T.PandA_Code = S.PandA_Code
WHEN NOT MATCHED BY TARGET -- When not matched by TARGET (there is in source but not in target)
THEN INSERT (<field1, field2, ...>)
VALUES (<S.field1, S.filed2, ...>) -- then insert them
OUTPUT deleted.*, $action, inserted.* INTO #TheTempTable;
SELECT * FROM #TheTempTable; -- here you can see the cnages and rollback if something is wrong
ROLLBACK TRAN;
GO
答案 1 :(得分:1)
这可以通过使用join而不是merge语句来完成:
UPDATE T SET T.PandA_Code = S.PandA_Code FROM tblstart T
INNER JOIN tblstars_new P ON P.Student_ID_Number = T.Student_ID_Number
WHERE T.PandA_Code <> S.PandA_Code