如何在SQL Server 2005中的一个语句中更新两个表?

我想一次更新两个表格。 我如何在SQL Server 2005中做到这一点?

UPDATE Table1, Table2 SET Table1.LastName='DR. XXXXXX', Table2.WAprrs='start,stop' FROM Table1 T1, Table2 T2 WHERE T1.id = T2.id AND T1.id = '010008' 

您不能在一个语句中更新多个表,但是,您可以使用事务来确保两个UPDATE语句被primefaces地处理。 您也可以批量避免往返。

 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; 

您无法一次更新两个表,但可以使用OUTPUT INTO将更新链接到插入,并且可以将此输出用作第二次更新的联接:

 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; 

我改变你的例子WHERE条件是比id idot字段,如果是id你不需要这个花哨的OUTPUT,你可以只更新第二个表为相同的id ='010008'。

对不起,afaik,你不能这样做。 要更新两个不同表中的属性,您需要执行两个单独的语句。 但是它们可以在一个批处理中(一组往返发送到服务器的SQL)

简短的答案是否定的。 虽然可以在update语句的from子句中input多个表,但只能在update关键字之后指定一个表。 即使你写了一个“可更新”的视图(这只是一个遵循某些限制的视图),像这样的更新将会失败。 以下是MSDN文档中的相关剪辑(重点是我的)。

UPDATE(Transact-SQL)

由table_or_view_name引用的视图必须是可更新的,并在视图的FROM子句中只引用一个基表 。 有关可更新视图的更多信息,请参阅CREATE VIEW(Transact-SQL)。

CREATE VIEW(Transact-SQL)

只要满足以下条件,就可以通过视图修改底层基表的数据:

  • 任何修改(包括UPDATE,INSERT和DELETE语句)都必须从一个基表中引用列。
  • 在视图中修改的列必须直接引用表列中的基础数据。 列不能以任何其他方式派生,例如通过以下方式:
    • 汇总函数:AVG,COUNT,SUM,MIN,MAX,GROUPING,STDEV,STDEVP,VAR和VARP。
    • 一个计算。 该列不能从使用其他列的expression式计算。 使用集合运算符UNION,UNION ALL,CROSSJOIN,EXCEPT和INTERSECT形成的列相当于计算,也不可更新。
  • 被修改的列不受GROUP BY,HAVING或DISTINCT子句的影响。
  • TOP不能在视图的select_statement的任何地方与WITH CHECK OPTION子句一起使用。

但是,诚实地说,按照LBushkin的例子,你应该考虑在事务中使用两个不同的SQL语句。

更新:我原来的断言,你可以更新多个表在一个可更新的视图是错误的。 在SQL Server 2005&2012上,它会产生以下错误。 我已经改正了我的答案,以反映这一点。

Msg 4405, Level 16, State 1, Line 1

View or function 'updatable_view' is not updatable because the modification affects multiple base tables.

您应该在事务中放置两个更新语句

这适用于MySQL,实际上只是一个隐含的事务,但它应该是这样的:

 UPDATE Table1 t1, Table2 t2 SET t2.field = t2.field+2, t1.field = t1.field+2 WHERE t1.id = t2.foreign_id and t2.id = '123414' 

如果你正在更新需要多语句的多表…如果你更新了一个,那么另一个基于其他条件,这可能是可能的…你应该使用一个事务。

您可以为一个表编写更新语句,然后在第一个表更新上写入触发器 ,这将更新第二个表