Domanda

Sto provando a fare il classico scenario Inserisci / Aggiorna in cui devo aggiornare le righe esistenti in un database o inserirle se non ci sono.

Ho trovato una domanda precedente sull'argomento , ma si occupa di stored procedure, che non sto usando. Vorrei solo usare le semplici istruzioni SQL SELECT, INSERT e UPDATE, a meno che non ci sia qualcosa di meglio disponibile (l'istruzione MERGE non è disponibile in SQL Server 2005).

Immagino che la mia idea generale sia questa:

If the row is found
  update
else
  insert

Per quanto riguarda il controllo dell'esistenza di una riga, quanto costa eseguire un'istruzione SELECT prima di chiamare un UPDATE o un INSERT? Oppure è meglio provare un AGGIORNAMENTO, verificare il numero di righe interessate e quindi eseguire un INSERT se le righe interessate sono 0?

È stato utile?

Soluzione

Il modo più efficiente è fare il AGGIORNAMENTO , quindi fare un INSERT se @@ rowcount è zero, come spiegato in questa risposta precedente .

Altri suggerimenti

(Prima di tutto, non proverei ad evitare le procedure memorizzate, se non ci sono motivi validi. Ciò offre un buon vantaggio nella maggior parte dei casi.)

Puoi farlo in questo modo:

  • crea una tabella (temporanea)
  • inserisci le tue righe
  • esegui INTERSECT che identifica le righe esistenti
  • aggiorna la tua tabella con loro
  • esegue un EXCEPT che identifica le nuove righe
  • esegue un inserto con questi elementi
  • elimina / cancella la tua tabella (temporanea)

Probabilmente funzionerà più velocemente se stai inserendo / aggiornando grandi quantità di righe.

Comprendi completamente che il tuo post è stato intitolato "SQL Server 2005" ma volevo solo buttare fuori qualcosa a cui guardare avanti se / quando esegui l'aggiornamento a SQL 2008. Microsoft ha aggiunto una nuova istruzione MERGE che ti darà la possibilità di codificare un'istruzione DML che esegue sia l'aggiornamento che l'inserimento. È molto bello. Devo ancora confrontare le prestazioni e gli I / O, ma è fantastico avere un altro strumento nella tua cassetta degli attrezzi.

Se hai sempre intenzione di:
* Conta le righe
* Inserisci / Aggiorna in base al risultato

Perché non invece:
* Elimina riga
* Inserisci riga

Stesso risultato e più ordinato.
Per quanto ne so quando aggiorni una riga, SQL Server esegue comunque un comando Elimina / Inserisci (dove esiste)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top