这些行通常第一次进入目标表的方式是使用少数列填充大部分文本数据,其余列设置为 NULL。在随后的传递中,新数据填充现有的已知(非空)和未知(空)数据。我已经确定新数据(#pld)确实包含不同的数据。数据似乎没有变化。这是我所拥有的:
BEGIN TRANSACTION
BEGIN TRY
MERGE INTO [metro].listings AS metroList
USING #pld as listnew
ON metroList.id = listnew.id
AND metroList.sid = listnew.sid
WHEN MATCHED AND (
metroList.User != listnew.User
or metroList.Email != listnew.Email
or metroList.LocName != listnew.LocName
) THEN
UPDATE SET
metroList.User = listnew.User,
metroList.Email = listnew.Email,
metroList.LocName = listnew.LocName,
WHEN NOT MATCHED THEN
INSERT
( User,
Email,
LocName
)
VALUES
(
listnew.User,
listnew.Email,
listnew.LocName
);
COMMIT TRANSACTION
END TRY
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END CATCH
我尝试将 != 替换为语句的更新部分下的 <> 。结果相同。这必须与一个可能的(可能的)空值与字符串的比较有关——甚至可能是另一个空值?无论如何,我呼吁所有的 sql-geeks 来解决这个问题。