9
votes

La gâchette TSQL doit tirer uniquement sur des colonnes dont les valeurs ont changé

J'ai écrit un déclencheur qui doit faire des travaux différents sur une table sur la base de laquelle les colonnes d'affilées sont réellement mises à jour. J'ai accompli cela en utilisant xxx

cette partie fonctionne bien. Il s'avère cependant qu'il existe d'autres parties du code qui mettent à jour les lignes en définissant chaque valeur si la valeur a été modifiée ou non, ce qui provoque l'incendie de la gâchette pour les pièces "mises à jour" mais dont les valeurs n'ont pas changé. du tout.

Modification du code qui cause ce problème n'est probablement pas une option, est-il un moyen plus facile d'éviter cela que d'avoir à comparer entre les tableaux insérés et supprimés (auquel cas les mises à jour si elles ne signifient pas de sens)?


0 commentaires

4 Réponses :


2
votes

Pas que je sache. inséré et supprimé existe une raison et la comparaison entre eux semble la meilleure option pour moi.

si la mise à jour () vous dit simplement si un insert ou la mise à jour tentative a été faite et ne reflète même pas si cette tentative a été réussie ou non.


0 commentaires

4
votes

La colonne a été mise à jour. Que l'ancienne valeur et la nouvelle valeur étaient les mêmes, c'est juste un détail. Je pense que votre seule solution est de comparer les valeurs entre les pseudo-tables insérés et supprimés.


0 commentaires

8
votes

Comme d'autres personnes ont dit, vous devez utiliser le inséré (code> et supprimé tables.

Voici ce que j'ai fait, au lieu de: < Pré> xxx

J'ai fait: xxx

utilisant sauf sélectionne les lignes distinctes où les colonnes que je suis intéressée ne sont pas existent dans la table supprimée (ou des données originales) (ce qui signifie que la valeur de ces colonnes a changé). Je ne sais pas si c'est la meilleure réponse, mais cela semble fonctionner.


0 commentaires

14
votes
SELECT
    CASE WHEN I.Col1 <> D.Col1 THEN 1 ELSE 0 END AS Col1Diff,
    CASE WHEN I.Col2 <> D.Col2 THEN 1 ELSE 0 END AS Col2Diff,
    ...
FROM
    INSERTED I JOIN DELETED D ON I.Key = D.Key

0 commentaires