UPSERT - ¿Existe una mejor alternativa para MERGE o @@ rowcount? [cerrado]


14

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

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

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

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

44
Esto parece una solicitud de función para Microsoft, no es algo que nadie aquí pueda ayudarlo a resolver. La solución que se le ocurrió a Microsoft es MERGE. Si eso no es lo suficientemente flexible / potente para usted, entonces necesita una solución diferente que aún no existe.
Aaron Bertrand

3
En mi opinión, MERGEes sencillo, flexible y también forma parte de SQL Standard. El verdadero problema con MERGEy otras UPSERTimplementaciones es la escalada de bloqueo potencial o incluso puntos muertos que no tiene nada que ver con la sintaxis.
a1ex07

Si tiene una pregunta, no dude en preguntarla. Como está escrito, esto es básicamente una diatriba sobre la MERGEimplementación en SQL Server.
JNK

Buena pregunta: ¿existe esencialmente una declaración UPSERT en la que el servidor se preocupa por si requiere una inserción o actualización? Estoy de acuerdo, MERGE no cumple lo que lógicamente esperaría de una implementación de "UPSERT". Dado que MS eligió implementar de esta manera, mi pregunta sería: ¿cuál podría haber sido una deficiencia, o imposible de implementar, si hubieran intentado implementar la sintaxis que usted (y yo) quisiéramos?
youcantryreachingme

Respuestas:


14

Creo que la respuesta simple a esto es no. MERGEfue la respuesta de Microsoft a la UPSERTlógica más complicada . Y ni siquiera mencionaste el peor enfoque:

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

Solo vomité en mi boca un poco escribiendo eso, pero en realidad es el que veo con más frecuencia.

En cualquier caso, si MERGEno 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 conMERGE :

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


2
Gracias Aaron Revisé la documentación de T-SQL en MSDN y no pude encontrar lo que estaba buscando; Solo pensé en tirarlo por si me faltaba algo. Si bien la declaración MERGE tiene sentido en ciertas situaciones, no puedo evitar sentir que es una solución de "mazo de martillo para clavar un clavo" para una simple operación de guardar. Quizás debería quitarme el sombrero de programador y ponerme mi DBA Fedora. Gracias por tomarse el tiempo para compartir sus pensamientos.
Pressacco
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.