Domanda

Sto cercando di fare una sola riga di inserimento / aggiornamento su un tavolo, ma tutti gli esempi là fuori sono per i set.

Chiunque può risolvere la mia sintassi per favore:

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')

Risoluzione per marc_s è quello di convertire la singola riga di una sottointerrogazione -. Che mi fa pensare il comando merge non è realmente inteso per singolo upserts fila

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');
È stato utile?

Soluzione

In sostanza, sei sulla strada giusta - ma ti manca una fonte da cui si desidera unire i dati - provare qualcosa di simile:

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')
; 

Non v'è alcuna sintassi speciale per una singola MERGE fila - tutto quello che dovete fare è usare una clausola adeguata. Con tale condizione corretta nella clausola ON, è possibile limitare la sorgente ad una singola riga - nessun problema.

E non dimenticare la virgola finale! Non è uno scherzo - è importante

questo post del blog per una buona introduzione alla MERGE.

Altri suggerimenti

Finalmente ho avuto la sintassi upsert utilizzando MERGE in SQL Server 2008. Utilizzando quello che Jacob ha voluto di fare (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 sintassi MERGE equivalente è:

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 (;).
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top