Chcę zaktualizować dwie tabele za jednym razem. Jak to zrobić w 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'
sql
sql-server
sql-server-2005
tsql
Jango
źródło
źródło
Odpowiedzi:
Nie można aktualizować wielu tabel w jednej instrukcji, można jednak użyć transakcji, aby upewnić się, że dwie
UPDATE
instrukcje są traktowane atomowo. Możesz je również grupować, aby uniknąć podróży w obie strony.źródło
Nie można zaktualizować dwóch tabel jednocześnie, ale można połączyć aktualizację ze wstawką za pomocą
OUTPUT INTO
i można użyć tego wyniku jako połączenia dla drugiej aktualizacji:Zmieniłem twój przykładowy
WHERE
warunek na inny niżid
. Jeśli to nie jestid
ci potrzebneOUTPUT
, możesz po prostuUPDATE
drugi stół dla tego samegoid='010008'
.źródło
T1.field
ma byćTable1.field
?Przepraszamy, nie możesz tego zrobić. Aby zaktualizować atrybuty w dwóch różnych tabelach, musisz wykonać dwie osobne instrukcje. Ale mogą być partiami (zestaw SQL wysłany do serwera podczas jednej podróży w obie strony)
źródło
Krótka odpowiedź na to pytanie brzmi: nie. Chociaż w
from
klauzuli instrukcji aktualizacji można wprowadzić wiele tabel , można podać tylko jedną tabelę poupdate
słowie kluczowym. Nawet jeśli napiszesz „aktualizowalny” widok (który jest po prostu widokiem zgodnym z pewnymi ograniczeniami), takie aktualizacje nie powiodą się. Oto odpowiednie klipy z dokumentacji MSDN (nacisk należy do mnie).AKTUALIZACJA (Transact-SQL)
UTWÓRZ WIDOK (Transact-SQL)
Szczerze mówiąc, powinieneś rozważyć użycie dwóch różnych instrukcji SQL w ramach transakcji, tak jak w przykładzie LBushkina.
AKTUALIZACJA: Moje pierwotne twierdzenie, że można aktualizować wiele tabel w widoku, który można aktualizować, było błędne. W SQL Server 2005 i 2012 wygeneruje następujący błąd. Poprawiłem swoją odpowiedź, aby to odzwierciedlić.
źródło
INSTEAD OF Specifies that the DML trigger is executed instead of the triggering SQL statement, therefore, overriding the actions of the triggering statements. INSTEAD OF cannot be specified for DDL or logon triggers.
Działa to dla MySQL i jest tak naprawdę tylko niejawną transakcją, ale powinno wyglądać mniej więcej tak:
jeśli wykonujesz aktualizacje wielu tabel, które wymagają wielu wyciągów… co jest możliwe, jeśli zaktualizujesz jeden, a następnie inny na podstawie innych warunków… powinieneś skorzystać z transakcji.
źródło
W transakcji należy umieścić dwie instrukcje aktualizacji
źródło
Możesz napisać instrukcję aktualizacji dla jednej tabeli, a następnie wyzwalacz przy pierwszej aktualizacji tabeli , która aktualizuje drugą tabelę
źródło
Z mojego punktu widzenia możesz to zrobić, to jedna do jednej aktualizacja dwóch tabel w SQL SERVER:
źródło
Jest to tak proste, jak to zapytanie pokazane poniżej.
źródło