Mi chiedevo se hai riscontrato un comando T-SQL simile al concetto di UPSERT? L'esecuzione delle operazioni INSERT | UPDATE mediante le opzioni (1) o (2) sembra eccessivamente complessa e soggetta a errori.
OBBIETTIVO
Per garantire che il record desiderato (in questo caso employee_id 1) sia aggiornato SENZA dover essenzialmente scrivere due volte la stessa query.
CONTESTO
- nome tabella: impiegato
- ID dipendente: ha una chiave primaria e la proprietà identità è impostata su vero
OPZIONI
esegue un SQL UPDATE ... controlla @@ rowcount = 0 e @@ error = 0 ... esegui SQL INSERT se richiesto
- con: devi effettivamente scrivere la stessa query due volte, una volta come un insert, una volta come un aggiornamento
- con: più codice = più tempo per digitare
- con: più codice = più spazio per l'errore
/programming/1106717/how-to-implement-a-conditional-upsert-stored-procedure "Aggiorna utilizzando @@ rowcount"
- eseguire un MERGE SQL
- con: devi effettivamente scrivere la stessa query due volte, una volta come un insert, una volta come un aggiornamento
- con: più codice = più tempo per digitare
- con: più codice = più spazio per l'errore
http://technet.microsoft.com/en-us/library/bb510625.aspx "Unione T-SQL"
- eseguire un UPSERT SQL (la funzione non esiste)
- pro: definisci una volta la relazione dati-tabella (lascia che SQL Server si preoccupi se si tratta di un INSERT o di un UPDATE)
- pro: less code = implementazione più rapida
- pro: meno codice = probabilità inferiore
ESEMPIO UPSERT
Impiegato UPSERT (dipendente_id, impiegato_numero, lavoro_titolo, nome_miodo, nome_modo, cognome, modificato_at) VALORI (1, '00 -124AB37 ',' Manager ',' John ',' T ',' Smith ', GetDate ());
- se employee_id 1 non esiste: MS SQL esegue un'istruzione INSERT
- se employee_id 1 esiste: MS SQL esegue e l'istruzione UPDATE
MERGE
è semplice, flessibile ed è anche parte di SQL Standard. Il vero problema con MERGE
e altre UPSERT
implementazioni è la potenziale escalation dei blocchi o persino i deadlock che non hanno nulla a che fare con la sintassi.
MERGE
sull'implementazione in SQL Server.