Способ, которым эти строки обычно попадают в целевую таблицу в первый раз с редким числом столбцов, заполненных в основном текстовыми данными, а остальная часть столбцов установлена в NULL. При последующих проходах свежие данные заполняют существующие известные (не нулевые) и неизвестные (NULL) данные. Я убедился, что свежие данные (#pld) действительно содержат разные данные. Данные не изменяются. Вот что у меня есть:sql server: MERGE имеет неожиданные результаты
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
Я попытался замены = в соответствии с частью обновления заявления с <>!. Те же результаты. Это должно быть связано с сопоставлением возможного (вероятного) значения null со строкой - возможно, даже с другим значением null? Во всяком случае, я призываю всех разработчиков sql-geeks распутать это.
Не выглядит правильно мне. –
ooops.My fault.NULLIF() не работает, если первое значение равно NULL. В моем обновлении я проверяю его с помощью ISNULL(). Извините еще раз и спасибо @Martin Smith +100500 –