2013-05-13 2 views
2

Думаю, я слишком долго смотрел на это утверждение. Может ли кто-нибудь сказать мне, почему часть обновления этого утверждения не обновляется? Я думаю, что, тестировав с помощью столбцов и !=, это должно вызывать причину обновлений только тогда, когда это необходимо - вместо этого я, похоже, случайно создал условие .. где обновление никогда не понадобилось!SQL Server: часть обновления слияния не работает

Здесь 4 вещи, которые необходимо знать перед тем, как смотреть на инструкцию:
1. Данные в таблице temp #Facilities заполняются самыми современными данными из нескольких источников. Эти данные содержат бот new (insert) и изменены (update) данные.
2. Содержимое #Facilities проверено, чтобы содержать данные, перед выполнением оператора Merge.
3. Вставка части выражения слияния завершается успешно.
4. Хотя часть обновления инструкции не обновляет измененные данные, оператор не прерывается.

MERGE INTO PhoneMaster AS facilitymaster 
USING #Facilities as facilitynew 
    ON facilitymaster.facilityid = facilitynew.facilityid 
    AND facilitymaster.siteid = facilitynew.siteid 
    WHEN MATCHED AND 
    (
     facilitymaster.User__bID != facilitynew.User__bID 
    or facilitymaster.Email__baddress != facilitynew.Email__baddress 
    or facilitymaster.Facility__bName != facilitynew.Facility__bName 
    or facilitymaster.Division != facilitynew.Division 
    or facilitymaster.District != facilitynew.District 
    ) THEN 
    UPDATE SET 
    facilitymaster.User__bID = facilitynew.User__bID, 
    facilitymaster.Email__baddress = facilitynew.Email__baddress, 
    facilitymaster.Facility__bName = facilitynew.Facility__bName, 
    facilitymaster.Division = facilitynew.Division, 
    facilitymaster.District = facilitynew.District 
    WHEN NOT MATCHED THEN 
    INSERT 
    (User__bID, 
    Email__baddress, 
    Facility__bName, 
    Division, 
    District, 
      FacilityId, 
    SiteId 

) 
    VALUES 
    (
    facilitynew.User__bID, 
    facilitynew.Email__baddress, 
    facilitynew.Facility__bName, 
    facilitynew.Division, 
    facilitynew.District, 
      facilitynew.FacilityId, 
    facilitynew.SiteId 

); 
+0

Зачем вам нужен MERGE? Как вы думаете, что он покупает вас (кроме более сложного и трудно отлаживаемого синтаксиса)? Кажется, вы могли бы добиться этого гораздо проще с помощью 'UPDATE WHERE EXISTS/INSERT WHERE NOT EXISTS'. –

+1

@ Аарон, почему бы не использовать слияние для чего-то подобного? Я не вижу, чтобы синтаксис был как можно более сложным. Здесь есть пробел между тем, что, как я думаю, должно работать, и почему это не так. Любые идеи о том, почему эта логика не работает? – plditallo

+0

У меня нет энергии, чтобы смотреть на логику, но вот почему я не использую MERGE (помимо синтаксиса невозможного запоминания): http://www.sqlperformance.com/2013/02/t -sql-query/another-merge-bug (пожалуйста, прочитайте весь пост). –

ответ

1

Одна вещь, которую я заметил, заключается в том, что ваш вкладка вставки не заполняет FacilityID или SiteID. Другое предложение, которое я хотел бы сделать, это закомментировать ваше предложение «И» в WHEN MATCHED, добавив обратно в строку за раз, пока не сработает. Я использую MERGE все время, и это очень быстро и эффективно.

+0

спасибо за ответ в пользу слияния! :) извините за инструкцию insert с отсутствующими атрибутами - они были там, это была неудачная работа по сокращению «n paste» - на самом деле этот оператор MERGE содержит много и много атрибутов. Я вырезал их, чтобы избавиться от шума - сосредоточиться на логике. – plditallo

+0

Я попробую ваш процесс, я знаю (от попытки), что, если я удалю предложение AND и просто сделаю прямое обновление с использованием ключей сайта/объекта, все хорошо - хотя он обновляет КАЖДУЮ совпадающую запись - нужно ли ей это или нет. Какая моя альтернатива для таблицы размером менее 100 тыс. Строк. было бы неплохо понять, что не так с моей логикой, так как я не смог бы применить одно и то же решение к таблице с миллионами строк. Этот логический недостаток, вероятно, что-то впечатляюще глупо! :) – plditallo

Смежные вопросы