【发布时间】:2016-08-15 15:21:14
【问题描述】:
我有一个表 tblstars_new,它每周都会从客户端更新。我有另一个表 tblstars,它需要从 tblstars_new 导入新的和更新的数据。
在 tblstars_new 中查找 tblstars 中不存在的行,然后将 then 添加到 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
【问题讨论】:
-
备份两个表并用新名称保存它们,然后进行测试。我希望它不会造成太大问题,并且安全 100 倍。
-
~我认为只是将您的 WHEN NOT MATCHED 切换为 WHEN MATCHED 可能会很好,但尚未测试
-
如果@sboahra 的答案解决了您的问题,那么
which needs to import new and updated data from tblstars_new.呢? new 呢?
标签: sql sql-server merge