web-dev-qa-db-ja.com

SQL Server 2005で1つのステートメントで2つのテーブルを更新する方法

一度に2つのテーブルを更新したいです。 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'
171
Jango

1つのステートメントで複数のテーブルを更新することはできませんが、トランザクションを使用して2つの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;
178
LBushkin

一度に2つのテーブルを更新することはできませんが、OUTPUT INTOを使用して更新を挿入にリンクすることができ、この出力を2番目の更新の結合として使用できます。

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'に対して2番目のテーブルを更新するだけです。

76
Remus Rusanu

申し訳ありませんが、できません。 2つの異なるテーブルの属性を更新するには、2つの別々のステートメントを実行する必要があります。しかし、それらはバッチ(1往復でサーバーに送信される一連のSQL)になることができます。

18
Charles Bretana

それに対する簡単な答えはノーです。 updateステートメントのfrom節には複数のテーブルを入力できますが、updateキーワードの後に​​指定できるテーブルは1つだけです。たとえあなたが "更新可能な"ビュー(単にある種の制限に従うビューである)を書いたとしても、このような更新は失敗するでしょう。これがMSDNドキュメントからの関連クリップです(強調は私のものです)。

UPDATE(Transact-SQL)

Table_or_view_nameによって参照されるビューは更新可能でなければならず、ビューのFROM文節で1つの基本表を参照してください。更新可能ビューの詳細については、「CREATE VIEW(Transact-SQL)」を参照してください。

CREATE VIEW(Transact-SQL)

以下の条件に該当する限り、ビューを通じて基礎となる実表のデータを変更できます。

  • UPDATE、INSERT、およびDELETEステートメントを含むすべての変更は、からの列を1つの基本テーブルのみを参照する必要があります。
  • ビューで変更されている列は、テーブル列の基になるデータを直接参照する必要があります。以下のような他の方法で列を派生させることはできません。
    • 集約関数:AVG、COUNT、SUM、MIN、MAX、GROUPING、STDEV、STDEVP、VAR、およびVARP。
    • 計算です。他の列を使用する式から列を計算することはできません。集合演算子UNION、UNION ALL、CROSSJOIN、EXCEPT、およびINTERSECTを使用して形成された列は計算になり、更新もできません。
  • 変更される列は、GROUP BY、HAVING、またはDISTINCT句の影響を受けません。
  • TOPは、WITH CHECK OPTION句と一緒にビューのselect_statementのどこにも使用されません。

正直なところ、LBushkinの例に従って、トランザクション内で2つの異なるSQLステートメントを使用することを検討する必要があります。

UPDATE:更新可能なビューで複数のテーブルを更新できるという私の最初の主張は間違っていました。 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.

14
jveazey

トランザクション内に2つの更新ステートメントを配置する必要があります

7
Mick

これは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'

マルチステートメントを必要とするマルチテーブルへの更新を行っている場合…他の条件に基づいて別のステートメントを更新するのであればおそらく可能です…トランザクションを使用するべきです。

6
user3662407

updateステートメントをone tableのように記述し、その後にtrigger /を記述することができます。on最初のテーブルupdate、2番目のテーブルを更新