Bất kỳ giá trị nào trong số bốn giá trị trong #S
sẽ khớp với giá trị hàng đơn của bảng mục tiêu của bạn (tất cả các giá trị trong #S có id =1 và name ='A' - vì vậy tất cả chúng đều khớp với hàng đơn trong mục tiêu), do đó giá trị này sẽ được cập nhật bốn lần - đó là lỗi nói, và nó hoàn toàn đúng.
Bạn thực sự muốn đạt được điều gì ở đây ??
Bạn có muốn đặt Địa chỉ thành giá trị đầu tiên từ bảng nguồn không? Sử dụng TOP 1
mệnh đề trong lựa chọn con của bạn:
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;
Bạn có muốn đặt Địa chỉ thành một phần tử ngẫu nhiên của các giá trị từ bảng nguồn không? Sử dụng TOP 1
và ORDER BY NEWID()
mệnh đề trong lựa chọn con của bạn:
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;
Nếu bạn so khớp bốn hàng nguồn với một hàng mục tiêu, bạn sẽ không bao giờ nhận được kết quả hữu ích - bạn cần biết mình thực sự muốn gì.
Marc