一度に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'
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;
一度に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番目のテーブルを更新するだけです。
申し訳ありませんが、できません。 2つの異なるテーブルの属性を更新するには、2つの別々のステートメントを実行する必要があります。しかし、それらはバッチ(1往復でサーバーに送信される一連のSQL)になることができます。
それに対する簡単な答えはノーです。 updateステートメントのfrom
節には複数のテーブルを入力できますが、update
キーワードの後に指定できるテーブルは1つだけです。たとえあなたが "更新可能な"ビュー(単にある種の制限に従うビューである)を書いたとしても、このような更新は失敗するでしょう。これがMSDNドキュメントからの関連クリップです(強調は私のものです)。
Table_or_view_nameによって参照されるビューは更新可能でなければならず、ビューのFROM文節で1つの基本表を参照してください。更新可能ビューの詳細については、「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.
トランザクション内に2つの更新ステートメントを配置する必要があります
これは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'
マルチステートメントを必要とするマルチテーブルへの更新を行っている場合…他の条件に基づいて別のステートメントを更新するのであればおそらく可能です…トランザクションを使用するべきです。
updateステートメントをone tableのように記述し、その後にtrigger /を記述することができます。on最初のテーブルupdate、2番目のテーブルを更新