SQL Server MERGE, если существует, обновить еще вставить - PullRequest
1 голос
/ 15 марта 2012

У меня есть таблица с именем data со столбцами ip, report_date, group, value. Первичный ключ - ip, report_date и group вместе.

Когда таблица пуста, и я запускаю приведенный ниже оператор, ничего не вставляется. Что не так с моим утверждением?

При совпадении запись обновляется в соответствии с планом ...

MERGE bc_data2 AS Target
USING (SELECT ip, report_date, group, value FROM bc_data2 As b
WHERE b.ip = '1.1.1.2'
AND b.report_date = '2/29/2012'
AND b.group = 'EPO-Client-Update') AS Source
ON (Target.ip = Source.ip
AND Target.frequency = Source.frequency
AND Target.report_date = Source.report_date
AND Target.service = Source.service
AND Target.proxy_service = Source.proxy_service
AND Target.proxy = Source.proxy
AND Target.service_group = Source.service_group)
WHEN MATCHED THEN
    UPDATE SET Target.value = Target.value + 1
WHEN NOT MATCHED BY Target THEN
    INSERT (ip, report_date, group, value)
    VALUES ('1.1.1.2', '2/29/2012', 'EPO-Client-Update', 119437142);

Ответы [ 2 ]

4 голосов
/ 15 марта 2012

Вы не добавляете никаких строк, потому что ваше предложение using не возвращает никаких строк. Поместите свои константы в предложение using с псевдонимами столбцов и используйте поля в when not matched

Нечто подобное с парой полей убрало простоту.

merge bc_data2 as T
using (select '1.1.1.2' as ip,
              '2012-02-29' as report_date,
              1194370142 as value) as S
on T.ip = S.ip and
   T.report_date = S.report_date
when matched then
  update set T.value = T.value + 1
when not matched then
  insert (ip, report_date, value) 
    values(ip, report_date, value);
0 голосов
/ 15 марта 2012

Я обнаружил, что NULLs плохо сравнивается в предложении ON оператора MERGE.Однако преобразование NULLs в пробелы является допустимым обходным решением.Я бы изменил оператор ON, чтобы он выглядел примерно так:

ON (ISNULL(Target.ip, '')           = ISNULL(Source.ip, '')
AND ISNULL(Target.frequency, '')    = ISNULL(Source.frequency, '')
AND ISNULL(Target.report_date, '')  = ISNULL(Source.report_date, '')
AND ...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...