2012-03-15 80 views
1

我有一個表叫data的列ip, report_date, group, value。主鍵是ip,report_dategroup在一起。SQL Server合併,如果存在,則更新其他插入

當表格爲空時,我運行下面的語句,沒有插入任何內容。我的發言有什麼問題?

如果有匹配的記錄是根據計劃更新...

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

東西快速嘗試 - 冒了出來'BY Target'?你還在'TRY/CATCH'裏面做這個嗎? 'bc_data2'上是否有觸發器?也許有一個錯誤或有意的回滾,你沒有看到。 – 2012-03-15 13:00:53

+0

我試圖直接在服務器管理工​​作室的聲明。刪除「按目標」沒有任何區別。 – Bas 2012-03-15 13:04:46

回答

3

因爲你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

+1 - 好趕上 – Lamak 2012-03-15 13:43:30

+0

謝謝!本可以解決這個問題:$ – Bas 2012-03-15 16:06:21

0

我發現NULLs不要在MERGE語句的ON子句中比較好。但是,將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 ...) 
相關問題