下面的代码成功地更新了现有记录,但没有插入细节不匹配的新记录,我不明白为什么不作为代码编译并且不会抛出任何错误消息。我确定我错过了一些明显的东西。作为参考,我使用 SQL Server 2008 和区分大小写的排序规则,但我看不出这有什么不同。我还有其他 MERGE 案例可以正常工作,只是这一个不能很好地发挥作用。
要查看更新是否有效,请将 DEBUG 变量声明中的 colourid 修改为与插入语句中的值相同。
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