Qualquer um dos quatro valores em
#S
corresponderá ao valor de linha única da sua tabela de destino (todos os valores em #S têm id =1 e name ='A' - portanto, todos correspondem à única linha no destino), portanto, esse valor será atualizado quatro vezes - é esse o erro diz, e está absolutamente certo. O que você realmente quer alcançar aqui??
Deseja definir o endereço para o primeiro dos valores da tabela de origem? Use um
TOP 1
cláusula em sua subseleção: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;
Deseja definir o endereço como um elemento aleatório dos valores da tabela de origem? Use um
TOP 1
e ORDER BY NEWID()
cláusula em sua subseleção: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 você combinar quatro linhas de origem com uma única linha de destino, nunca obterá um resultado útil - você precisa saber o que realmente deseja.
Marco