首页 文章

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

提问于
浏览
163

我想一次更新两个表 . 我如何在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'

8 回答

  • 76

    您无法在一个语句中更新多个表,但是,您可以使用事务来确保以原子方式处理两个 UPDATE 语句 . 您也可以批量处理它们以避免往返 .

    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;
    
  • 6

    您不能一次更新两个表,但可以使用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,如果是id你不需要这个花哨的OUTPUT,你可以只为相同的id ='010008'更新第二个表 .

  • 14

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

  • 7

    对此的简短回答是否定的 . 虽然可以在update语句的 from 子句中输入多个表,但只能在 update 关键字后指定单个表 . 即使您确实编写了一个"updatable"视图(这只是一个遵循某些限制的视图),这样的更新也会失败 . 以下是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 . 一个计算 . 无法从使用其他列的表达式计算列 . 通过使用集合运算符UNION,UNION ALL,CROSSJOIN,EXCEPT和INTERSECT形成的列相当于计算并且也不可更新 . 要修改的列不受GROUP BY,HAVING或DISTINCT子句的影响 . TOP不会在视图的select_statement中的任何位置与WITH CHECK OPTION子句一起使用 .

    但是,老实说,根据LBushkin的例子,你应该考虑在事务中使用两个不同的SQL语句 .

    UPDATE: 我可以在可更新视图中更新多个表的原始断言是错误的 . 在SQL Server 2005和2012上,它将生成以下错误 . 我已经纠正了我的回答以反映这一点 .

    消息4405,级别16,状态1,行1视图或函数'updatable_view'不可更新,因为修改会影响多个基表 .

  • 18

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

  • 172

    这适用于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'
    

    如果您正在对需要多语句的多表进行更新...如果您更新一个,则可能更新,而另一个基于其他条件...您应该使用事务 .

  • 1

    您可以为 one table 编写 update 语句,然后在 first table 更新上编写 trigger ,更新第二个表

  • -2

    它就像下面显示的查询一样简单 .

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

相关问题