it-swarm.com.de

Wie aktualisiere ich zwei Tabellen in einer Anweisung in SQL Server 2005?

Ich möchte zwei Tabellen auf einmal aktualisieren. Wie mache ich das in 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'
176
Jango

Sie können nicht mehrere Tabellen in einer Anweisung aktualisieren. Sie können jedoch eine Transaktion verwenden, um sicherzustellen, dass zwei UPDATE -Anweisungen atomar behandelt werden. Sie können sie auch stapeln, um eine Rundreise zu vermeiden.

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;
182
LBushkin

Sie können nicht zwei Tabellen gleichzeitig aktualisieren, aber Sie können ein Update mit OUTPUT INTO in eine Einfügung verknüpfen und diese Ausgabe als Join für das zweite Update verwenden:

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;

Ich habe die WHERE-Bedingung Ihres Beispiels so geändert, dass sie ein anderes Feld als id enthält. Wenn id nicht benötigt wird, können Sie einfach die zweite Tabelle für dieselbe id = '010008' AKTUALISIEREN.

76
Remus Rusanu

Sorry, afaik, das kannst du nicht machen. Um Attribute in zwei verschiedenen Tabellen zu aktualisieren, müssen Sie zwei separate Anweisungen ausführen. Sie können jedoch in einem Stapel (eine Reihe von SQL-Anweisungen, die in einem Umlauf an den Server gesendet werden) vorliegen.

20
Charles Bretana

Die kurze Antwort darauf lautet nein. Während Sie in der from - Klausel einer Update-Anweisung mehrere Tabellen eingeben können, können Sie nach dem update - Schlüsselwort nur eine einzelne Tabelle angeben. Selbst wenn Sie eine "aktualisierbare" Ansicht schreiben (bei der es sich lediglich um eine Ansicht handelt, die bestimmten Einschränkungen unterliegt), schlagen Aktualisierungen wie diese fehl. Hier sind die relevanten Clips aus der MSDN-Dokumentation (Schwerpunkt liegt bei mir).

PDATE (Transact-SQL)

Die von table_or_view_name referenzierte Sicht muss aktualisierbar sein und in der FROM-Klausel der Sicht auf genau eine Basistabelle verweisen. Weitere Informationen zu aktualisierbaren Ansichten finden Sie unter CREATE VIEW (Transact-SQL).

CREATE VIEW (Transact-SQL)

Sie können die Daten einer zugrunde liegenden Basistabelle über eine Ansicht ändern, sofern die folgenden Bedingungen erfüllt sind:

  • Alle Änderungen, einschließlich UPDATE-, INSERT- und DELETE-Anweisungen, müssen auf Spalten aus nur eine Basistabelle verweisen.
  • Die in der Ansicht geänderten Spalten müssen direkt auf die zugrunde liegenden Daten in den Tabellenspalten verweisen. Die Spalten können nicht auf andere Weise abgeleitet werden, z. B. durch Folgendes:
    • Eine Aggregatfunktion: AVG, COUNT, SUM, MIN, MAX, GROUPING, STDEV, STDEVP, VAR und VARP.
    • Eine Berechnung. Die Spalte kann nicht aus einem Ausdruck berechnet werden, der andere Spalten verwendet. Spalten, die mit den Mengenoperatoren UNION, UNION ALL, CROSSJOIN, EXCEPT und INTERSECT gebildet werden, stellen eine Berechnung dar und können auch nicht aktualisiert werden.
  • Die zu ändernden Spalten sind von den GROUP BY-, HAVING- oder DISTINCT-Klauseln nicht betroffen.
  • TOP wird zusammen mit der WITH CHECK OPTION-Klausel nirgendwo in der select_statement-Anweisung der Ansicht verwendet.

Um ehrlich zu sein, sollten Sie zwei verschiedene SQL-Anweisungen in einer Transaktion gemäß dem Beispiel von LBushkin verwenden.

UPDATE: Meine ursprüngliche Behauptung, Sie könnten mehrere Tabellen in einer aktualisierbaren Ansicht aktualisieren, war falsch. In SQL Server 2005 und 2012 wird der folgende Fehler generiert. Ich habe meine Antwort korrigiert, um dies widerzuspiegeln.

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

Sie sollten zwei Aktualisierungsanweisungen in eine Transaktion einfügen

7
Mick

Dies funktioniert für MySQL und ist eigentlich nur eine implizite Transaktion, sollte aber ungefähr so ​​aussehen:

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'

wenn Sie Aktualisierungen an mehreren Tabellen vornehmen, für die mehrere Anweisungen erforderlich sind, ist dies wahrscheinlich möglich, wenn Sie eine und eine andere aktualisieren, basierend auf anderen Bedingungen. Sie sollten eine Transaktion verwenden.

7
user3662407

Sie können die Anweisung pdate für eine Tabelle und dann ein Trigger für erste Tabelle update schreiben, wodurch die zweite Tabelle aktualisiert wird