あなたの論理が間違っていると思います。
あなたのロジックは次のとおりです。
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
更新:
MERGE がどのように機能するか想像してみてください: ソースが空で、ターゲットが空ではありません。
MERGE
2種類のWHEN NOT MATCHED
句を持つことができます
初め、
[ WHEN NOT MATCHED [ BY TARGET ] [ AND <clause_search_condition> ]
THEN <merge_not_matched> ]
つまり、ターゲットにペアがないソースのすべての行に対して、ターゲットに INSERT を実行できます。したがって、空のソースがある場合は、何もする機会がありませんINSERT
。
<merge_not_matched>::=
{
INSERT [ ( column_list ) ]
{ VALUES ( values_list )
| DEFAULT VALUES }
}
2番、
[ WHEN NOT MATCHED BY SOURCE [ AND <clause_search_condition> ]
THEN <merge_matched> ] [ ...n ]
つまり、ソースにペアがないターゲットのすべての行に対して、ターゲットで UPDATE または DELETE を実行できます。INSERT を実行する可能性はありません。
<merge_matched>::=
{ UPDATE SET <set_clause> | DELETE }
作品を作成MERGE
するために、ソースを空にする必要はありません。あなたのソースはSELECT
withWHERE
句なので、空のソースになる可能性があります。したがって、ある種の条件ロジックで空にならないようにし、一時テーブルまたはテーブル変数を使用するか、トリッキーな JOIN または UNION を使用する必要があります。その場合のアイデアをMERGE
まったく捨てて、古典的な条件付きUPDATE
orを実行することをお勧めしINSERT
ます。