Me preguntaba si ha encontrado un comando T-SQL similar al concepto de UPSERT. Realizar operaciones INSERT | UPDATE con las opciones (1) o (2) parece excesivamente complejo y propenso a errores.
OBJETIVO
Para garantizar que el registro deseado (en este caso employee_id 1) esté actualizado SIN tener que escribir esencialmente la misma consulta dos veces.
CONTEXTO
- nombre de la tabla: empleado
- ID de empleado: tiene una clave principal y la identidad de identidad se establece en verdadero
OPCIONES
ejecute una ACTUALIZACIÓN de SQL ... verifique @@ rowcount = 0 y @@ error = 0 ... ejecute SQL INSERT si es necesario
- con: tiene que escribir la misma consulta dos veces, una vez como inserción, una vez como actualización
- con: más código = más tiempo escribiendo
- con: más código = más margen de error
/programming/1106717/how-to-implement-a-conditional-upsert-stored-procedure "Actualizar usando @@ rowcount"
- ejecutar un SQL MERGE
- con: tiene que escribir la misma consulta dos veces, una vez como inserción, una vez como actualización
- con: más código = más tiempo escribiendo
- con: más código = más margen de error
http://technet.microsoft.com/en-us/library/bb510625.aspx "T-SQL Merge"
- ejecutar un UPSERTERT de SQL (la función no existe)
- pro: define la relación de datos a tabla una vez (deje que SQL Server se preocupe por si es o no un INSERT o una ACTUALIZACIÓN)
- pro: menos código = implementación más rápida
- pro: menos código = menor probabilidad
EJEMPLO DE INICIO
UPSERT employeee (employee_id, employee_number, job_title, first_name, middle_name, apellido, modified_at) VALUES (1, '00 -124AB37 ',' Manager ',' John ',' T ',' Smith ', GetDate ());
- si employee_id 1 no existe: MS SQL ejecuta una instrucción INSERT
- si employee_id 1 existe: MS SQL se ejecuta y la instrucción UPDATE
fuente
MERGE
es sencillo, flexible y también forma parte de SQL Standard. El verdadero problema conMERGE
y otrasUPSERT
implementaciones es la escalada de bloqueo potencial o incluso puntos muertos que no tiene nada que ver con la sintaxis.MERGE
implementación en SQL Server.Respuestas:
Creo que la respuesta simple a esto es no.
MERGE
fue la respuesta de Microsoft a laUPSERT
lógica más complicada . Y ni siquiera mencionaste el peor enfoque:Solo vomité en mi boca un poco escribiendo eso, pero en realidad es el que veo con más frecuencia.
En cualquier caso, si
MERGE
no es lo suficientemente flexible o potente para usted, le sugiero que envíe una solicitud de función a Microsoft en http://connect.microsoft.com/sql/ y explique a fondo su caso de negocios. Siempre y cuando se aferre a las ventajas reales de la sintaxis propuesta sobreMERGE
, tendrá mi voto. Si cuelgas demasiado en la parte "propensa a errores", no es tan probable que compre. ¿Por qué? Porque puedes señalar con cualquier dedo cualquier afirmación.Dicho esto, no creo que haya nadie aquí que pueda hacer por usted específicamente. Debe investigar los posibles problemas con
MERGE
:http://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/
fuente