3 votes

Dans une clause OUTPUT dans un déclencheur INSERT, est-il possible de faire référence aux deux tables INSÉRÉES ?

Lors de la création d'un nouvel enregistrement dans une table, je dois créer un enregistrement dans chacune des deux autres tables (b et c). Le truc, c'est que les deux nouveaux enregistrements doivent avoir la même valeur PK, qui doit être de type UNIQUEIDENTIFIER et est donc générée à l'aide de NEWID() et n'a aucun lien avec la clé de l'enregistrement d'origine. Donc, ce que je veux faire dans le DÉCLENCHEUR INSERT ressemble à ceci :

INSERT INTO [b] ([bKey], [Foo])
OUTPUT inserted.[bKey] [cKey], i.[Bar] INTO [c]
SELECT NEWID(), i.[Foo] FROM inserted i

Cependant, cela semble être illégal (Dans une clause OUTPUT dans un déclencheur INSTEAD OF INSERT, est-il possible de faire référence aux deux tables INSERTED?). Y a-t-il un moyen de le faire autrement qu'en utilisant un CURSEUR et une variable pour le résultat de NEWID()?

3voto

Damien_The_Unbeliever Points 102139

La clause OUTPUT d'une instruction INSERT ne peut pas faire référence à d'autres tables que la table factice inserted de la clause output - voir les notes sur from_table_name :

Est un préfixe de colonne qui spécifie une table incluse dans la clause FROM d'une instruction DELETE, UPDATE ou MERGE qui est utilisée pour spécifier les lignes à mettre à jour ou supprimer.

1voto

Andriy M Points 40395

Je pense que vous pouvez utiliser une variable de table/table temporaire pour atteindre votre objectif :

DECLARE @tmp TABLE (
  [bKey] …,
  [Foo] …,
  [Bar] …
);

INSERT INTO @tmp ([bKey], [Foo], [Bar])
SELECT NEWID(), [Foo], [Bar] FROM inserted;

INSERT INTO [b] ([bKey], [Foo])
SELECT [bKey], [Foo] FROM @tmp;

INSERT INTO [c] ([cKey], [Bar])
SELECT [bKey], [Bar] FROM @tmp;

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:

X