BEGIN TRANSACTION;
UPDATE Table1
SET Table1.LastName = 'DR. XXXXXX'
FROM Table1 T1, Table2 T2
WHERE T1.id = T2.id
and T1.id = '011008';
UPDATE Table2
SET Table2.WAprrs = 'start,stop'
FROM Table1 T1, Table2 T2
WHERE T1.id = T2.id
and T1.id = '011008';
COMMIT;
DECLARE @ids TABLE (id int);
BEGIN TRANSACTION
UPDATE Table1
SET Table1.LastName = 'DR. XXXXXX'
OUTPUT INSERTED.id INTO @ids
WHERE T1.field = '010008';
UPDATE Table2
SET Table2.WAprrs = 'start,stop'
FROM Table2
JOIN @ids i on i.id = Table2.id;
COMMIT;
8 回答
您无法在一个语句中更新多个表,但是,您可以使用事务来确保以原子方式处理两个
UPDATE
语句 . 您也可以批量处理它们以避免往返 .您不能一次更新两个表,但可以使用OUTPUT INTO将更新链接到插入,并且可以将此输出用作第二个更新的连接:
我将你的示例WHERE条件改为某个字段而不是id,如果是id你不需要这个花哨的OUTPUT,你可以只为相同的id ='010008'更新第二个表 .
对不起,afaik,你做不到 . 要更新两个不同表中的属性,您需要执行两个单独的语句 . 但它们可以在一个批处理中(一组往返一次发送到服务器的SQL)
对此的简短回答是否定的 . 虽然可以在update语句的
from
子句中输入多个表,但只能在update
关键字后指定单个表 . 即使您确实编写了一个"updatable"视图(这只是一个遵循某些限制的视图),这样的更新也会失败 . 以下是MSDN文档中的相关剪辑(重点是我的) .UPDATE (Transact-SQL)
CREATE VIEW (Transact-SQL)
但是,老实说,根据LBushkin的例子,你应该考虑在事务中使用两个不同的SQL语句 .
UPDATE: 我可以在可更新视图中更新多个表的原始断言是错误的 . 在SQL Server 2005和2012上,它将生成以下错误 . 我已经纠正了我的回答以反映这一点 .
您应该在事务中放置两个更新语句
这适用于MySQL,实际上只是一个隐式事务,但它应该是这样的:
如果您正在对需要多语句的多表进行更新...如果您更新一个,则可能更新,而另一个基于其他条件...您应该使用事务 .
您可以为 one table 编写 update 语句,然后在 first table 更新上编写 trigger ,更新第二个表
它就像下面显示的查询一样简单 .