Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL中同时更新多个表_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

在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中有可延迟的约束,我们将更接近于能够说一个事务中的多个更新与单个更新相同。