L'une des quatre valeurs de #S
correspondra à la valeur de ligne unique de votre table cible (toutes les valeurs dans #S ont id =1 et name ='A' - donc elles correspondent toutes à la ligne unique dans la cible), donc cette valeur sera mise à jour quatre fois - c'est ce que l'erreur dit, et c'est tout à fait vrai.
Qu'est-ce que vous voulez vraiment réaliser ici ?
Voulez-vous définir l'adresse sur la première des valeurs de la table source ? Utilisez un TOP 1
clause dans votre sous-sélection :
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;
Voulez-vous définir l'adresse sur un élément aléatoire des valeurs de la table source ? Utilisez un TOP 1
et ORDER BY NEWID()
clause dans votre sous-sélection :
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;
Si vous faites correspondre quatre lignes source à une seule ligne cible, vous n'obtiendrez jamais un résultat utile - vous devez savoir ce que vous voulez vraiment.
Marc