以下のコードは既存のレコードを正常に更新していますが、詳細が一致しない新しいレコードを挿入しません。コードがコンパイルされ、エラー メッセージがスローされない理由がわかりません。私は明らかな何かを見逃したと確信しています。参考までに、大文字と小文字を区別する照合で SQL Server 2008 を使用していますが、それがどのように違いを生むのかわかりません。正常に動作する他の MERGE ケースがありますが、うまく動作しないのはこのケースだけです。
更新の動作を確認するには、DEBUG 変数宣言の colorid を変更して、insert ステートメントの値と同じにします。
BEGIN TRY
DROP TABLE #adr_test
END TRY
BEGIN CATCH
-- nothing to drop
END CATCH
CREATE TABLE #adr_test
(
style NVARCHAR(5)
,size_id INT
,colour_id INT
,cost MONEY
)
INSERT INTO #adr_test (style, size_id, colour_id, cost)
VALUES ('ADR01', 100, 101, 99.99)
/*DEBUG*/
DECLARE @style NVARCHAR(5) = 'ADR01'
DECLARE @sizeid INT = 100
DECLARE @colourid INT = 999
DECLARE @ctncost MONEY = 1.50
/*END DEBUG*/
MERGE #adr_test AS Tgt
USING (SELECT style, size_id, colour_id, cost
FROM #adr_test
WHERE style = @style
AND size_id = @sizeid
AND colour_id = @colourid) AS Src ON Src.style = Tgt.style
AND Src.size_id = Tgt.size_id
AND Src.colour_id = Tgt.colour_id
WHEN MATCHED AND Tgt.cost <> @ctncost
THEN
UPDATE SET Tgt.cost = @ctncost
WHEN NOT MATCHED BY TARGET
THEN
INSERT (style, size_id, colour_id, cost)
VALUES (@style, @sizeid, @colourid, @ctncost);
SELECT * FROM #adr_test