web-dev-qa-db-fra.com

Comment mettre à jour deux tables dans une instruction dans SQL Server 2005?

Je veux mettre à jour deux tables en une fois. Comment faire cela dans 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

Vous ne pouvez pas mettre à jour plusieurs tables dans une seule instruction. Toutefois, vous pouvez utiliser une transaction pour vous assurer que deux instructions UPDATE sont traitées de manière atomique. Vous pouvez également les grouper pour éviter un aller-retour.

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

Vous ne pouvez pas mettre à jour deux tables à la fois, mais vous pouvez lier une mise à jour dans une insertion à l'aide de OUTPUT INTO et utiliser cette sortie comme jointure pour la deuxième mise à jour:

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;

J'ai changé votre exemple de condition WHERE pour qu'il s'agisse d'un autre champ que id, si id est, vous n'avez pas besoin de cette sortie élégante, vous pouvez simplement mettre à jour la deuxième table pour le même id = '010008'.

76
Remus Rusanu

Désolé, autant que vous puissiez, vous ne pouvez pas faire ça. Pour mettre à jour des attributs dans deux tables différentes, vous devez exécuter deux instructions distinctes. Mais ils peuvent être dans un lot (un ensemble de SQL envoyé au serveur en un aller-retour)

20
Charles Bretana

La réponse courte à cette question est non. Bien que vous puissiez entrer plusieurs tables dans la clause from d'une instruction de mise à jour, vous ne pouvez spécifier qu'une seule table après le mot clé update. Même si vous écrivez une vue "pouvant être mise à jour" (qui est simplement une vue qui respecte certaines restrictions), les mises à jour comme celle-ci échoueront. Voici les clips pertinents de la documentation MSDN (c'est moi qui souligne).

PDATE (Transact-SQL)

La vue référencée par table_or_view_name doit pouvoir être mise à jour et référencer exactement une table de base dans la clause FROM de la vue. Pour plus d'informations sur les vues pouvant être mises à jour, consultez CREATE VIEW (Transact-SQL).

CREATE VIEW (Transact-SQL)

Vous pouvez modifier les données d'une table de base sous-jacente via une vue, à condition que les conditions suivantes soient remplies:

  • Toute modification, y compris les instructions UPDATE, INSERT et DELETE, doit référencer les colonnes de à une seule table de base .
  • Les colonnes en cours de modification dans la vue doivent référencer directement les données sous-jacentes dans les colonnes de la table. Les colonnes ne peuvent pas être dérivées autrement, par exemple:
    • Une fonction d'agrégation: AVG, COUNT, SOMME, MIN, MAX, GROUPEMENT, STDEV, STDEVP, VAR et VARP.
    • Un calcul. La colonne ne peut pas être calculée à partir d'une expression qui utilise d'autres colonnes. Les colonnes formées à l'aide des opérateurs d'ensemble UNION, UNION ALL, CROSSJOIN, EXCEPT et INTERSECT constituent un calcul et ne peuvent pas non plus être mises à jour.
  • Les colonnes en cours de modification ne sont pas affectées par les clauses GROUP BY, HAVING ou DISTINCT.
  • TOP n'est utilisé nulle part dans l'instruction select_statement de la vue avec la clause WITH CHECK OPTION.

En toute honnêteté, cependant, vous devriez envisager d'utiliser deux instructions SQL différentes au sein d'une transaction, conformément à l'exemple de LBushkin.

UPDATE: Mon assertion initiale selon laquelle vous pouviez mettre à jour plusieurs tables dans une vue pouvant être mise à jour était erronée. Sur SQL Server 2005 et 2012, l’erreur suivante sera générée. J'ai corrigé ma réponse pour refléter cela.

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

Vous devez placer deux instructions de mise à jour dans une transaction.

7
Mick

Cela fonctionne pour MySQL et n’est en réalité qu’une transaction implicite, mais cela devrait ressembler à ceci:

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'

si vous effectuez des mises à jour de plusieurs tables nécessitant des instructions multiples… ce qui est probablement possible si vous en mettez à jour une, puis une autre en fonction d'autres conditions… vous devez utiliser une transaction.

7
user3662407

Vous pouvez écrire pdate instruction pour ne table puis un déclencheur sur première table update, qui met à jour la seconde table