syntax para una sola fila MERGE / upsert en SQL Server

Estoy tratando de hacer una inserción / actualización de una sola fila en una tabla, pero todos los ejemplos que hay son para conjuntos.

¿Alguien puede arreglar mi syntax por favor?

MERGE member_topic ON mt_member = 0 AND mt_topic = 110 WHEN MATCHED THEN UPDATE SET mt_notes = 'test' WHEN NOT MATCHED THEN INSERT (mt_member, mt_topic, mt_notes) VALUES (0, 110, 'test') 

La resolución por marc_s consiste en convertir la fila única en una subconsulta, lo que me hace pensar que el comando MERGE no está destinado a los upserts de fila única.

 MERGE member_topic USING (SELECT 0 mt_member, 110 mt_topic) as source ON member_topic.mt_member = source.mt_member AND member_topic.mt_topic = source.mt_topic WHEN MATCHED THEN UPDATE SET mt_notes = 'test' WHEN NOT MATCHED THEN INSERT (mt_member, mt_topic, mt_notes) VALUES (0, 110, 'test'); 

Básicamente, estás en el camino correcto, pero te falta una fuente desde la que deseas fusionar los datos, prueba algo como esto:

 MERGE member_topic AS target USING someOtherTable AS source ON target.mt_member = source.mt_member AND source.mt_member = 0 AND source.mt_topic = 110 WHEN MATCHED THEN UPDATE SET mt_notes = 'test' WHEN NOT MATCHED THEN INSERT (mt_member, mt_topic, mt_notes) VALUES (0, 110, 'test') ; 

No hay una syntax especial para una sola fila MERGE: todo lo que necesita hacer es usar una cláusula adecuada. Con esa condición adecuada en la cláusula ON , puede limitar la fuente a una sola fila, no hay problema.

¡Y no olvides el punto y coma final! No es broma, ¡es importante!

Vea esta publicación de blog para una muy buena introducción a MERGE .

finalmente obtuve la syntax Upsert usando MERGE en SQL Server 2008. Usando lo que Jacob quería hacer (un Upsert):

 IF EXISTS(SELECT * FROM member_topic WHERE mt_member = 0 AND mt_topic = 110) BEGIN --update existing row UPDATE member_topic SET mt_notes = 'test' WHERE mt_member = 0 AND mt_topic = 110 END ELSE BEGIN --insert new row INSERT INTO member_topic (mt_member, mt_topic, mt_notes) VALUES (0, 110, 'test') END 

La syntax MERGE equivalente es:

 MERGE member_topic USING ( VALUES (0, 110, 'test') ) AS foo (mt_member, mt_topic, mt_notes) ON member_topic.mt_member = foo.mt_member AND member_topic.mt_topic = foo.mt_topic WHEN MATCHED THEN UPDATE SET mt_notes = foo.mt_notes WHEN NOT MATCHED THEN INSERT (mt_member, mt_topic, mt_notes) VALUES (foo.mt_member, foo.mt_topic, foo.mt_notes) ; --A MERGE statement must be terminated by a semi-colon (;).