Uno qualsiasi dei quattro valori in #S
corrisponderà al valore della singola riga della tabella di destinazione (tutti i valori in #S hanno id =1 e name ='A' - quindi corrispondono tutti alla singola riga nella destinazione), quindi questo valore verrà aggiornato quattro volte - ecco qual è l'errore dice, ed è assolutamente giusto.
Cosa vuoi davvero ottenere qui??
Vuoi impostare l'indirizzo sul primo dei valori della tabella di origine? Usa un TOP 1
clausola nella tua sottoselezione:
MERGE #T
USING (SELECT TOP 1 id, name, address FROM #S) AS S
ON #T.id = S.id AND #T.Name = S.Name
WHEN NOT MATCHED THEN
INSERT VALUES(S.id,S.Name, S.Address)
WHEN MATCHED THEN
UPDATE SET Address = S.Address;
Vuoi impostare l'indirizzo su un elemento casuale dei valori dalla tabella di origine? Usa un TOP 1
e ORDER BY NEWID()
clausola nella tua sottoselezione:
MERGE #T
USING (SELECT TOP 1 id, name, address FROM #S ORDER BY NEWID()) AS S
ON #T.id = S.id AND #T.Name = S.Name
WHEN NOT MATCHED THEN
INSERT VALUES(S.id,S.Name, S.Address)
WHEN MATCHED THEN
UPDATE SET Address = S.Address;
Se abbini quattro righe di origine a una singola riga di destinazione, non otterrai mai un risultato utile:devi sapere cosa vuoi veramente.
Marco