Bonjour à tous,

En fait, je tourne en rond depuis ce matin à la recherche d'une solution.

J’explique.

Je suis dans un trigger que je veux rendre le plus dynamiquement possible, car il sera dupliqué sur plusieurs tables de ma base (si il marche un jour...).

Dans ce trigger, j'ai besoin de comparer les champs avant et après insertion afin d'insérer des valeurs dans une autre table. Pour cela, j'utilise les tables inserted & deleted.

Comme je l'ai expliqué plus haut, il faut que ce soit dynamique donc je ne veux pas écrire une comparaison pour chaque colonne de la table et recommencer cela pour chaque table donc, je parcours le schéma de ma table pour avoir le nom des colonnes :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
DECLARE curseur1 CURSOR for select Column_name,Data_type  FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME= '' + @tablename + '' and Column_name <> 'evolution'
OPEN curseur1;
FETCH curseur1 INTO @nomcol,@datatype;
 WHILE @@FETCH_STATUS = 0
 BEGIN
 
 ......
 FETCH curseur1 INTO @nomcol,@datatype ;
 END
CLOSE curseur1;
DEALLOCATE curseur1;
cela marche bien.
Maintenant je voudrais récupérer la valeur avant et après insertion de la colonne @nomcol et c'est là que rien ne va plus, car je n'arrive pas à faire une requête sql dynamique à l'intérieur de ma boucle sur la table inserted ou deleted.

par exemple si je place ce code dans ma boucle :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
SET @Sql = 'SELECT @old_Name = ' + @nomcol + ' FROM deleted';
SET @ParmDefinition = N' @old_Name varchar(30) OUTPUT'; 
EXECUTE sp_executesql @Sql, @ParmDefinition, @old_Name=@oldName OUTPUT;
=> il ne connait plus la table deleted car il la considère comme une table de ma base apparemment.

Avez-vous une idée ?

Merci de votre aide.