在SQL中同时更新多个表
我有一个表查询在SQL中同时更新多个表,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个表查询 UPDATE D SET D.VALUE = B.VALUE FROM DOM D INNER JOIN COM C ON C.ID = D.ID INNER JOIN TOM T ON T.ID = D. ID WHERE D.VALUE <> B.VALUE UPDATE D SET C.VALUE = B.VALUE FROM DOM D INNER JOIN COM C ON C.ID = D
UPDATE D
SET D.VALUE = B.VALUE
FROM
DOM D
INNER JOIN
COM C ON C.ID = D.ID
INNER JOIN
TOM T ON T.ID = D. ID
WHERE
D.VALUE <> B.VALUE
UPDATE D
SET C.VALUE = B.VALUE
FROM
DOM D
INNER JOIN
COM C ON C.ID = D.ID
INNER JOIN
TOM T ON T.ID = D. ID
WHERE
D.VALUE <> B.VALUE
这里,两个查询的where条件相同,连接也相同。那么我可以用一条update语句更新两个表吗?不能用一条update语句更新两个表。但是,通过将两个单独的更新包装到一个事务中,可以在一个事务中更新两个表。它实现了同样的目标,但方式略有不同
BEGIN TRANSACTION
UPDATE D
SET D.VALUE = B.VALUE
FROM
DOM D
INNER JOIN COM C ON C.ID = D.ID
INNER JOIN TOM T ON T.ID = D. ID
WHERE D.VALUE <> B.VALUE
UPDATE D
SET C.VALUE = B.VALUE
FROM
DOM D
INNER JOIN COM C ON C.ID = D.ID
INNER JOIN TOM T ON T.ID = D. ID
WHERE D.VALUE <> B.VALUE
COMMIT TRANSACTION
最明显的解决方案是在DOM表上编写更新触发器。此触发器将处理TOM和COM表
Select 1 ID, 10 Value
into DOM
union all
Select 2, 20
union all
Select 3, 30
Select 1 ID, 10 Value
into TOM
union all
Select 2, 20
union all
Select 3, 30
Select 1 ID, 10 Value
into COM
union all
Select 2, 20
union all
Select 3, 30
drop trigger DomUpdate
create trigger DomUpdate on DOM
after Update
as
begin
Update TOM
set value = i.value
from TOM t
INNER JOIN
inserted I ON I.ID = T. ID
Update COM
set value = i.value
from TOM t
INNER JOIN
inserted I ON I.ID = T. ID
end
GO
Select D.value
FROM
DOM D
INNER JOIN
COM C ON C.ID = D.ID
INNER JOIN
TOM T ON T.ID = D. ID
WHERE
D.VALUE <> 50
begin tran t1
Update D
set D.value = 50
FROM
DOM D
INNER JOIN
COM C ON C.ID = D.ID
INNER JOIN
TOM T ON T.ID = D. ID
WHERE
D.VALUE <> 50
--rollback tran t1
commit tran t1
Select * from DOM
Select * from COM
Select * from TOM
不能使用单个update语句更新多个表。不能使用单个update语句更新多个表,但可以将所有更新放在单个事务中,以便提交或回滚所有更新。我将添加begin try…end try begin catch。。。终止catch@AlexKudryashev是的,如果问题是关于错误处理,我会建议,但问题是关于更新:它实现了同样的事情-几乎。在每条语句的末尾检查约束。因此,如果您有一对更新,其中任何一个更新本身都会导致违反约束,但是当将这对更新放在一起考虑时,约束会得到维护,那么执行两个单独的更新与假设的update multiple tables SYMBOLE语句不是一回事。当然,如果我们在SQL Server中有可延迟的约束,我们将更接近于能够说一个事务中的多个更新与单个更新相同。