2011-11-24 15 views
6

Digamos que tengo una tabla y quiero insertar una fila. La clave de la nueva fila ya puede coincidir con la clave de una fila existente en la tabla, en cuyo caso quiero actualizar la fila existente. O bien, puede no existir en la tabla, en cuyo caso debe insertarse la nueva fila.T-SQL ¿Es posible hacer una actualización/inserción con una sola operación rápida

¿Cuál es la forma más eficiente de realizar una operación de este tipo? Estaba pensando en hacer primero un SELECT (quizás con EXISTS) para ver si una clave particular está presente, seguido por un UPDATE si está presente y un INSERT si no es así. Probablemente necesite mantener un UPDLOCK y un HOLDLOCK para esta combinación de declaraciones a fin de evitar condiciones de carrera también. Esto parece demasiado complicado e ineficiente.

Me preguntaba si había una forma más eficiente de hacerlo en SQL Server 2008R2.

Respuesta

10

SQL Server 2008 y versiones posteriores tienen una instrucción MERGE que hace exactamente eso.

Consulte el MSDN Books Online docs on MERGE para más detalles.

Básicamente, se necesitan cuatro cosas:

  • un fuente (tabla o vista o estado de cuenta en línea SELECT)
  • un objetivo
  • un unirse a condición que une los dos
  • declaraciones para los casos en que hay un PARTIDO (las filas existen tanto en el origen como en el destino), NO COINCIDEN (cuando la fila no existe en el alquitrán) obtener aún) y así sucesivamente

Así que básicamente define algo como:

MERGE (targettable) AS t 
USING (sourcetable) AS s 
ON (JOIN condition between s and t) 
WHEN MATCHED THEN 
    UPDATE SET t.Col1 = s.Col1, t.Col2 = s.Col2 (etc.) 
WHEN NOT MATCHED THEN 
    INSERT(Col1, Col2, ..., ColN) VALUES(s.Col1, s.Col2, ......, s.ColN) 

Esto se hace como una declaración y altamente optimizado por SQL Server.

+0

Muy buena respuesta, +1 y aceptar ... –

Cuestiones relacionadas