Я предполагаю, что вы ошибаетесь.
Ваша логика:
if source is empty* then insert my row
* Источник пуст, когда
SELECT '20120101' as [date] , 1 as sip , 2 as dip , 80 as port
возвращает 0 строк ..
Так ведь вы пытаетесь объединить цели с пустым источником. Это логическая ошибка.
Вы должны написать, а что-то вроде этого
IF EXISTS(SELECT * from iplog Where [date]='20120101' and sip=1 and dip=2 and port=80)
BEGIN
UPDATE
iplog
SET
t.size=t.size+1
WHERE
[date]='20120101' and sip=1 and dip=2 and port=80
END
ELSE
BEGIN
INSERT INTO iplog VALUES ('20120101',1,2,80,1)
END
UPDATE: Представьте, как MERGE работы: У вас есть пустой источник и не пустой цели.
MERGE
может иметь два вида WHEN NOT MATCHED
положений
Во-первых,
[ WHEN NOT MATCHED [ BY TARGET ] [ AND <clause_search_condition> ]
THEN <merge_not_matched> ]
Это означает, что для каждой строки в источнике без пары на цели, которую вы можете сделать вставку в цель. Поэтому, если у вас есть пустой источник, нет никаких причин делать INSERT
.
<merge_not_matched>::=
{
INSERT [ (column_list) ]
{ VALUES (values_list)
| DEFAULT VALUES }
}
Во-вторых,
[ WHEN NOT MATCHED BY SOURCE [ AND <clause_search_condition> ]
THEN <merge_matched> ] [ ...n ]
Это означает, что для каждой строки в мишени без пары у источника вы можете сделать UPDATE или DELETE на цели. Нет возможности делать INSERT.
<merge_matched>::=
{ UPDATE SET <set_clause> | DELETE }
Для того, чтобы сделать MERGE
, вам не нужен источник empy. Ваш источник равен SELECT
с предложением WHERE
, поэтому он может стать пустым источником.Поэтому вы должны сделать его непустым с какой-то кодирующей логикой, использовать временную таблицу или таблицу varialble или сложный JOIN или UNION .. Но таким образом ваш код может стать нечитаемым для вас. Лучше отказаться от идеи MERGE
в этом случае вообще и сделать классический условный UPDATE
или INSERT
.
Как целевой стол может быть источником, когда вы нацеливаетесь на «когда не соответствует»? Что бы это значило? –