154 votes

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

Je veux mettre à jour deux tables en une seule fois. Comment dois-je faire 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'

167voto

LBushkin Points 60611

Vous ne pouvez pas mettre à jour plusieurs tables en une seule instruction, cependant, vous pouvez utiliser une transaction pour vous assurer que les deux UPDATE des déclarations sont traitées de manière atomique. Vous pouvez également lot pour éviter de faire 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 = '010008'

UPDATE Table2
SET Table2.WAprrs = 'start,stop'
FROM Table1 T1, Table2 T2
WHERE T1.id = T2.id
and T1.id = '010008'

COMMIT

73voto

Remus Rusanu Points 159382

Vous ne pouvez pas mettre à jour deux tables à la fois, mais vous pouvez lier une mise à jour à un insert unsing de SORTIE, et vous pouvez utiliser cette sortie comme une 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 cas OÙ la condition pour être certains otther champ de l'id, si c'est l'id de la vous n'avez pas besoin de cette fantaisie de SORTIE, vous pouvez juste mettre à JOUR la deuxième table pour le même id='010008'.

17voto

Charles Bretana Points 59899

Désolé, autant que je sache, vous ne pouvez pas le faire. Pour mettre à jour les attributs dans deux tables différentes, vous devrez exécuter deux états distincts. Mais ils peuvent être dans un lot ( un ensemble de SQL envoyées au serveur dans un voyage aller-retour)

14voto

jveazey Points 2490

La réponse courte à cette question est non. Alors que vous pouvez entrer plusieurs tables dans l' from clause d'une instruction de mise à jour, vous ne pouvez spécifier qu'une seule table après l' update mot-clé. Même si vous n'écrivez un "mis à jour", ce qui est tout simplement un point de vue qui suit certaines restrictions), des mises à jour comme on va à l'échec. Voici les extraits pertinents de la documentation MSDN (l'emphase est mienne).

Mise à JOUR (Transact-SQL)

La vue référencée par table_or_view_name doit être mise à jour et de référence exactement une table de base dans la clause from de la vue. Pour plus d'informations sur les vues pouvant être mis à jour, voir CRÉER une VUE (Transact-SQL).

Pour CRÉER une VUE (Transact-SQL)

Vous pouvez modifier les données d'une base sous-jacente de la table à travers une vue, aussi longtemps que les conditions suivantes sont remplies:

  • Toute modification, y compris UPDATE, INSERT et DELETE, doit faire référence à des colonnes à partir d' une seule table de base.
  • Les colonnes modifiées dans la vue doit faire référence directement aux données sous-jacentes dans les colonnes de la table. Les colonnes ne peuvent pas être dérivées d'une autre façon, telle que la suivante:
    • Une fonction d'agrégation: AVG, COUNT, SUM, MIN, MAX, REGROUPEMENT, ECARTYPE, ECARTYPEP, VAR et VAR.
    • Un calcul. La colonne ne peut pas être calculée à partir d'une expression qui utilise d'autres colonnes. Les colonnes sont formées par l'aide de l'ensemble des opérateurs de l'UNION, l'UNION de TOUS, CROSSJOIN, à l'EXCEPTION, se CROISENT et se montant à un calcul et ne sont pas modifiables.
  • Les colonnes en cours de modification ne sont pas affectées par le GROUP BY, HAVING, ou de clauses DISTINCT.
  • En HAUT n'est pas utilisé n'importe où dans le select_statement de la vue avec la clause with CHECK OPTION.

En toute honnêteté, si, vous devriez envisager d'utiliser deux instructions SQL dans une transaction comme par LBushkin l'exemple.

Mise à JOUR: Mon affirmation que vous pourriez mettre à jour plusieurs tables dans une telle vue est erroné. Sur SQL Server 2005 et 2012, il génère l'erreur suivante. 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.

7voto

Mick Sharpe Points 1463

Vous devez placer deux de mise à jour des énoncés à l'intérieur d'une transaction

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: