La meilleure façon de vérifier si une ligne a été mise à jour dans SQL

J'ai une instruction de mise à jour qui met à jour une table. Et il y a une colonne qui enregistre la dernière heure modifiée. Si datatables d'une ligne spécifique n'ont pas été modifiées, je ne souhaite pas modifier la date et l'heure de la dernière modification.

Quel est le meilleur moyen de vérifier si une instruction de mise à jour va changer la ligne de données ou non.

Merci,

Vérifiez l'ancienne vs nouveldatatables dans votre code au lieu de le faire dans une requête.

Pas besoin de déranger la couche DB inutilement si datatables n'ont pas changé du tout.

En résumé, si datatables n'ont pas changé, n'envoyez pas l'instruction UPDATE.

L'one-way est de commencer une transaction, select le contenu de la rangée et le comparez à ce que vous allez le mettre à jour. Si elles ne correspondent pas, effectuez la mise à jour et mettez fin à la transaction. Si elles correspondent, annulez la transaction.

Si vous voulez le faire de manière préventive, la seule façon de penser que vous le ferez est de modifier la clause WHERE de l'instruction de mise à jour pour comparer la valeur existante à la nouvelle valeur (pour CHAQUE valeur). Si l'un d'entre eux n'est pas égal, la mise à jour doit avoir lieu.

C'est quand un DAL est maniable. Il garde la trace de toutes les colonnes, donc si aucune n'a changé, je n'envoie même pas d'instruction UPDATE à la database.

On dirait que vous passez par une table et que vous modifiez certaines lignes, puis vous voulez revenir en arrière dans la table une seconde fois et mettre à jour l'horodatage des lignes qui viennent d'être modifiées.

Ne le faites pas en deux passes. Mettez à jour la date et l'heure en même time que vous mettez à jour les autres colonnes que vous modifiez:

UPDATE myTable SET retailprice = wholesaleprice * 1.10, lastmodified = GetDate() WHERE ... 

Ou êtes-vous en train d'émettre une instruction de mise à jour sur TOUTES les lignes, mais pour la plupart des lignes, il ne fait que la mettre à la valeur qu'il a déjà? Ne fais pas ça. Excluez les lignes qui ne seraient pas modifiées dans votre clause where:

 UPDATE myTable SET retailprice = wholesaleprice * 1.10, lastmodified = GetDate() WHERE retailprice <> wholesaleprice * 1.10 

Cela dépend si vous avez le contrôle des données ou non. Seb ci-dessus est correct en disant que vous devriez vérifier les anciennes données par rapport aux nouveldatatables avant de faire la mise à jour. Mais que faire si datatables ne sont pas sous votre contrôle?

Supposons que vous soyez un service Web invité à effectuer une mise à jour. Ensuite, la seule façon de vérifier serait d'interroger datatables existantes et de les comparer aux nouveldatatables.

Je ne connais aucune fonctionnalité SQL qui permettrait de détecter si la mise à jour a effectivement modifié des données ou non.

SQL permet de détecter le nombre de lignes incluses dans une instruction de mise à jour. Ne pas savoir d'un moyen de détecter si une instruction de mise à jour a effectivement changé des données, ce serait intéressant de savoir.

Si vous utilisez sql 2005/2008, vous pouvez procéder comme suit dans la procédure stockée.

 update newTable set readKey='1' output inserted.id, inserted.readKey as readKey, deleted.readKey as prevReadKey into @tempTable where id = '1111' 

Ensuite, vous pouvez sélectionner @tempTable pour vérifier si prevReadKey et readKey ont une valeur similaire si les deux ont une valeur similaire, vous pouvez réinitialiser votre dernière date-heure modifiée.

De cette façon, vous n'avez pas à lancer plusieurs requêtes sur la table dans le cas où une valeur est en train de changer. Mais oui dans le cas où la valeur ne change pas, cela mettra à jour deux instructions de mise à jour où aucune n'est requirejse. Cela devrait être OK si ces cas sont rares.

PS NOTE: – La requête donnée peut être syntaxiquement erronée car elle n'est pas testée. Mais c'est ainsi que votre problème peut être résolu. Je l'ai fait de la manière suivante en utilisant la clause OUTPUT avec l'instruction Merge dans un de mes projets et cela peut être fait avec une instruction de mise à jour aussi. Voici la reference de la clause OUTPUT

Vous POUVEZ écrire un triggersur INSTEAD OF UPDATE dans T-SQL, où vous pourriez faire ce qui a été suggéré plus haut dans la couche DAL – comparez les valeurs dans l'logging existant avec les valeurs dans l'instruction update et appliquez la mise à jour . Vous pouvez utiliser la fonction Columns_Updated () dans le triggersur pour voir si quelque chose a été mis à jour et procéder en conséquence.

Ce n'est pas particulièrement efficace du sharepoint vue de la machine, mais vous pouvez l'écrire une fois et gérer cette situation quelle que soit l'application, la procédure stockée ou tout autre process essayant de mettre à jour l'logging.