UPSERT - Esiste un'alternativa migliore a MERGE o @@ rowcount? [chiuso]


14

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

  1. 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"

  1. 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"

  1. 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

4
Sembra una richiesta di funzionalità per Microsoft, non qualcosa che chiunque qui può aiutarti a risolvere. La soluzione che Microsoft ha trovato è MERGE. Se questo non è abbastanza flessibile / potente per te, allora hai bisogno di una soluzione diversa che non esiste ancora.
Aaron Bertrand

3
A mio avviso, MERGEè semplice, flessibile ed è anche parte di SQL Standard. Il vero problema con MERGEe altre UPSERTimplementazioni è la potenziale escalation dei blocchi o persino i deadlock che non hanno nulla a che fare con la sintassi.
a1ex07,

Se hai una domanda, sentiti libero di farla. Come scritto, questo è fondamentalmente una diatriba MERGEsull'implementazione in SQL Server.
JNK,

Buona domanda: esiste essenzialmente un'istruzione UPSERT in cui il server si preoccupa se richiede un inserimento o un aggiornamento. Sono d'accordo, MERGE non soddisfa ciò che ci si aspetterebbe logicamente da un'implementazione di "UPSERT". Dato che MS ha scelto di implementare in questo modo, la mia domanda sarebbe: quale potrebbe essere stata una lacuna, o impossibile da implementare, se avessero tentato di implementare la sintassi che tu (e io) avremmo voluto?
Youcantryreachingme,

Risposte:


14

Penso che la semplice risposta a questa domanda sia no. MERGEfu la risposta di Microsoft alla UPSERTlogica più contorta . E non hai nemmeno elencato l'approccio peggiore:

IF (SELECT COUNT ... ) > 0
    UPDATE
ELSE
    INSERT

Ho appena vomitato in bocca un po 'digitandolo, ma in realtà è quello che vedo più spesso.

In ogni caso, se MERGEnon è abbastanza flessibile o abbastanza potente per te, ti suggerisco di inviare una richiesta di funzionalità a Microsoft all'indirizzo http://connect.microsoft.com/sql/ e di spiegare a fondo il tuo caso aziendale. Finché ti attieni ai reali vantaggi della tua sintassi proposta MERGE, hai il mio voto. Se appendi troppo alla parte "soggetta a errori", non ho le stesse probabilità di acquistare. Perché? Perché puoi fare il dito grosso su qualsiasi affermazione.

Detto questo, non credo che ci sia qualcosa che qualcuno qui possa fare per te in particolare. È necessario esaminare i potenziali problemi con MERGE:

http://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/


2
Grazie Aaron. Ho consultato la documentazione T-SQL su MSDN e non sono riuscito a trovare quello che cercavo; ho pensato di buttarlo là fuori nel caso mi fossi perso qualcosa. Mentre l'affermazione MERGE ha senso in determinate situazioni, non posso fare a meno di pensare che sia una soluzione "mazza da martellare in un chiodo" per una semplice operazione di salvataggio. Forse dovrei prendere il mio cappello da programmatore e indossare il mio Fedora DBA. Grazie per aver dedicato del tempo per condividere i tuoi pensieri.
Pressacco,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.