Insertar/actualizar en SQL Server 2005 sin usar procedimientos almacenados

Estoy tratando de hacer el clásico escenario Insert/Update 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 se trata con procedimientos almacenados, que no estoy usando. Me gustaría simplemente usar sentencias SQL SELECT, INSERT y UPDATE simples, a menos que haya algo mejor disponible (la instrucció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 caro es hacer una instrucción SELECT antes de llamar a una ACTUALIZACIÓN o un INSERTO? ¿O es mejor probar una ACTUALIZACIÓN, verificar el número de filas afectadas y luego hacer una INSERCIÓN si las filas afectadas son 0?

0

4 Respuestas

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

Puedes hacerlo de esta manera:

  • crear una tabla (temporal)
  • complete sus filas
  • ejecuta un INTERSECTO que identifica las filas existentes
  • actualice su tabla con ellos
  • ejecuta a EXCEPTO que identifica las nuevas filas
  • ejecuta una inserción con estos elementos
  • suelta/borra tu tabla (temporal)

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

0
agregado

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

0
agregado
Gracias, eso lo hizo! Esa pregunta no surgió en mi búsqueda ...
agregado el autor Paul Fedory, fuente

Si siempre vas a:

* Cuente las filas
* Insertar/Actualizar según el resultado

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

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

0
agregado
Muchas razones Justo fuera de mi cabeza: 1) podrías tener un disparador que actúe sobre ELIMINAR que no quieras disparar en este caso. 2) Si su tabla utiliza identidades, que probablemente debería, obtendrá las completamente nuevas. 3) SQL Server no puede optimizar tan fácilmente.
agregado el autor Sören Kuklau, fuente

Entender por completo que su publicación se tituló "SQL Server 2005", pero quería arrojar algo que esperar si/cuando se actualiza a SQL 2008. Microsoft ha agregado una nueva instrucción MERGE que le dará la capacidad de codificar una declaración DML que hace 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.

0
agregado
Descubrí que SQl Management Studio 2008 tiene algunos problemas con SQLServer 2000. Todavía no hay problema si no necesita volver tan lejos.
agregado el autor Craig Norton, fuente
Antes del RTM de agosto, tuvimos problemas para conectarnos a las instancias de SQL 2000 si el usuario no era un administrador del sistema. Afortunadamente eso fue arreglado en la versión RTM. ¿Qué otros problemas has visto?
agregado el autor Eric Sabine, fuente