I guess you logic is wrong.
Your logic is:
if source is empty* then insert my row
*Source is empty when
SELECT '20120101' as [date] , 1 as sip , 2 as dip , 80 as port
returns 0 rows..
So in fact you're trying to merge target with empty source. It's logic error.
You should rather write something like this
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:
Imagine how MERGE works:
You have empty source and not empty target.
MERGE can have two sorts of WHEN NOT MATCHED clauses
First,
[ WHEN NOT MATCHED [ BY TARGET ] [ AND <clause_search_condition> ]
THEN <merge_not_matched> ]
That means for every row in source without a pair at target you can do INSERT into target. So if you have empty source there is no occasion to do any INSERT.
<merge_not_matched>::=
{
INSERT [ ( column_list ) ]
{ VALUES ( values_list )
| DEFAULT VALUES }
}
Second,
[ WHEN NOT MATCHED BY SOURCE [ AND <clause_search_condition> ]
THEN <merge_matched> ] [ ...n ]
That means for every row in target without a pair at source you can do UPDATE or DELETE on target. No possibility to do INSERT.
<merge_matched>::=
{ UPDATE SET <set_clause> | DELETE }
To make MERGE works for you, you need not empy source. Your source is SELECT with WHERE clause, so it may become an empty source. So you should make it non empty with some sort of coditional logic, use some temporary table or table varialble or tricky JOIN or UNION.. But in that way your code may become unreadable for you. Better drop idea of MERGE in that case at all and do classic conditional UPDATE or INSERT.