Commande UPDATE partielle
-
03-07-2019 - |
Question
Je souhaite exécuter la commande UPDATE sur un groupe d'enregistrements, mais elle échoue car certains enregistrements postérieurs à la mise à jour violeraient une contrainte de table. Est-il possible de ne mettre à jour que des enregistrements appropriés?
La solution
Comportement de la mise à jour lorsque tout ou rien est voulu par la conception
Vous pouvez ajouter des clauses Where à votre commande Update pour vérifier toutes les contraintes, mais cela entraîne une duplication de code et non une bonne chose
Pourquoi ne pas effectuer la mise à jour ligne par ligne à l'aide d'un curseur ou d'une boucle CLR?
S'il s'agit d'une application multicouche, vos objets métier doivent connaître vos contraintes SQL via des métadonnées ou une interrogation de schéma afin que la validation des données puisse être effectuée avant leur frappe dans la base de données
Le cadre CSLA contient quelques avantages pour cela
Autres conseils
L’instruction update est elle-même atomique, elle réussira ou échouera. Vous devez modifier le code SQL pour mettre à jour uniquement les lignes où la contrainte ne sera pas violée.
Vous devez ajouter les contraintes à la clause WHERE.
Soit ça ou lancez la mise à jour séparément pour chaque ligne, mais cela ne semble pas du tout une bonne idée.
Pour ajouter à certaines des réponses déjà publiées: vous devrez peut-être utiliser une sous-requête dans la clause where. J'aime (en pseudo-code)
update mytable
set myfield = myval
where not exists (select from some table that would tell you if a constraint is violated for this row)
Si vous postez du code, je pourrais peut-être vous aider davantage.