Pregunta

Estoy tratando de hacer el clásico escenario Insertar / Actualizar donde necesito actualizar las filas existentes en una base de datos o insertarlas si no están allí.

He encontrado una pregunta anterior sobre el tema , pero trata con procedimientos almacenados, que no estoy usando. Me gustaría usar solo instrucciones SQL SELECT, INSERT y UPDATE, a menos que haya algo mejor disponible (la declaración MERGE no está disponible en SQL Server 2005).

Creo que mi idea general es esta:

If the row is found
  update
else
  insert

En cuanto a verificar la existencia de una fila, ¿qué tan costoso es hacer una instrucción SELECT antes de llamar a UPDATE o INSERT? ¿O es mejor simplemente intentar una ACTUALIZACIÓN, verificar el número de filas afectadas y luego INSERTAR si las filas afectadas son 0?

¿Fue útil?

Solución

La forma más eficiente es hacer UPDATE , luego hacer un INSERT si @@ rowcount es cero, como se explicó en esta respuesta anterior .

Otros consejos

(En primer lugar, no trataría de evitar los procedimientos almacenados, si no hay una razón sólida. Proporcionan un buen beneficio en la mayoría de los casos).

Puede hacerlo de esta manera:

  • crear una tabla (temporal)
  • complete sus filas
  • ejecuta un INTERSECT que identifica las filas existentes
  • actualiza tu tabla con ellos
  • ejecuta un EXCEPTO que identifica las nuevas filas
  • ejecutar una inserción con estos elementos
  • soltar / borrar su tabla (temporal)

Esto probablemente se ejecutará más rápido, si está insertando / actualizando grandes cantidades de filas.

Comprenda completamente que su publicación se tituló "SQL Server 2005" pero solo quería tirar algo que esperar si / cuando actualice a SQL 2008. Microsoft ha agregado una nueva declaración MERGE que le dará la capacidad de codificar una declaración DML que realiza tanto la actualización como la inserción. Es genial. Todavía tengo que comparar el rendimiento y las E / S, pero es genial tener otra herramienta en su caja de herramientas.

Si siempre vas a:
* Cuenta las filas
* Insertar / Actualizar en función del resultado

Por qué no en su lugar:
* Eliminar fila
* Insertar fila

Mismo resultado y más ordenado.
Por lo que sé cuando actualiza una fila, SQLServer realiza una eliminación / inserción de todos modos (donde exista)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top