sql-server-2008 - 在 SQL Server 中使用合并更新第三个表

标签 sql-server-2008

我有两个表 A 和 B。表 A 是源,B 是目标。根据某些条件,我要么更新 A 中 B 中的现有行(仅限选择性列),要么作为 A 中 B 中的新行插入。A 和 B 具有相同的列。这我可以使用 MERGE 来完成。

现在,如果表 B 中的行被更新,我需要更新第三个表 C 中的一些记录。是否可以在以下语句中执行此操作,

MERGE B
USING A
ON A.somecolumn = B.somecolumn

WHEN MATCHED THEN

UPDATE 
SET
B.somecolumn1 = A.somecolumn1,
B.somecolumn2 = A.somecolumn2

WHEN NOT MATCHED BY TARGET THEN
INSERT INTO B
somecolumn1, 
somecolumn2, 
somecolumn3,
somecolumn4 

VALUES
(
A.somecolumn1, 
A.somecolumn2, 
A.somecolumn3,
A.somecolumn4 
);

最佳答案

您需要 output 的临时存储来自使用临时表/表变量的合并语句和更新语句。

-- Your table A, B and C
declare @A table(ID int, Col int)
declare @B table(ID int, Col int)
declare @C table(ID int, Col int)

-- Sample data
insert into @A values (1, 1),(2, 2)
insert into @B values (1, 0)
insert into @C values (1, 0),(2, 0)

-- Table var to store ouput from merge
declare @T table(ID int, Col int, Act varchar(10))

-- Merge A -> B
merge @B as B
using @A as A
on A.ID = B.ID
when not matched then insert (ID, Col) values(A.ID, A.Col)
when matched then update set Col = A.Col
output inserted.ID, inserted.Col, $action into @T;

-- Update C with rows that where updated by merge    
update C set
  Col = T.Col
from @C as C
  inner join @T as T
    on C.ID = T.ID and
       T.Act = 'UPDATE'
https://data.stackexchange.com/stackoverflow/qt/119724/

关于sql-server-2008 - 在 SQL Server 中使用合并更新第三个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8337304/

相关文章:

sql - SQL Server 2008 代理作业中使用了谁的登录名

c# - 'Where' 表达式中的列名称无效

asp.net-mvc - IIS7,SQL 2008和ASP.NET MVC安全性

sql - 如何使用模式绑定(bind)创建存储过程?

mysql - 使用三张表查询SQL数据

sql-server - 其他硬盘上的 SQL Server 2008 TempDB

sql-server - MDF 和 LDF 文件大小

projects-and-solutions - 如何将自定义文件夹添加到 Sql Server Management Studio 2008 解决方案?

sql-server-2008 - sql server 2008连接字符串错误

c# - 我如何跟踪对数据库表的任何更改