Comando UPDATE parziale
-
03-07-2019 - |
Domanda
Voglio eseguire il comando UPDATE su un gruppo di record, ma fallisce, perché alcuni record dopo l'aggiornamento violerebbero un vincolo di tabella. È possibile aggiornare in qualche modo solo i record adatti?
Soluzione
Comportamento dell'aggiornamento in quanto tutto o niente è in base alla progettazione
È possibile aggiungere clausole Where al comando Update per verificare tutti i vincoli, ma ciò comporta la duplicazione del codice, non una buona cosa
Che ne dici di fare l'aggiornamento una riga alla volta usando un cursore Cursor o CLR?
Se fa parte di un'applicazione multistrato, è qui che i tuoi oggetti aziendali devono conoscere i tuoi vincoli SQL tramite metadati o interrogazioni dello schema in modo che la convalida dei dati possa essere eseguita prima che colpisca il database
Il CSLA framework ha alcune chicche per questo
Altri suggerimenti
L'istruzione update è di per sé atomica, avrà successo o fallirà. È necessario modificare l'SQL per aggiornare solo le righe in cui il vincolo non verrà violato.
Devi aggiungere i vincoli alla clausola WHERE.
O quello o esegui l'aggiornamento separatamente per ogni riga, ma questa non sembra affatto una buona idea.
Per aggiungere ad alcune delle risposte già pubblicate: potrebbe essere necessario utilizzare una sottoquery nella clausola where. Mi piace (nel codice psuedo)
update mytable
set myfield = myval
where not exists (select from some table that would tell you if a constraint is violated for this row)
Se pubblichi un codice, potrei essere in grado di aiutarti di più.