繁体   English   中英

SQL Server MERGE,如果存在则更新else插入

[英]SQL Server MERGE, if exist then update else insert

我有一个名为data的表ip, report_date, group, value其中包含列ip, report_date, group, value 主键是ipreport_dategroup在一起。

当表为空并且我运行下面的语句时,没有插入任何内容。 我的陈述有什么问题?

当匹配时,记录是按计划更新的...

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);

您不添加任何行,因为您的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);

我发现在MERGE语句的ON子句中NULLs不能很好地比较。 但是,将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 ...)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM