【问题标题】:T-SQL MERGE statement is not inserting a new record - what is wrong with my code?T-SQL MERGE 语句未插入新记录 - 我的代码有什么问题?
【发布时间】:2019-04-02 14:15:12
【问题描述】:

下面的代码成功地更新了现有记录,但没有在细节不匹配的地方插入新记录,我不明白为什么不这样做,因为代码编译并且不会抛出任何错误消息。我确定我错过了一些明显的东西。作为参考,我使用 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

【问题讨论】:

  • 您正在合并到您从中选择的同一个表中,它永远不会匹配。
  • 是的,它会的。在上面的示例中,USING 查询将返回一个 NULL 数据集,因为没有带有此 @colourid 的记录。因此它不匹配
  • 我怀疑由于你的源是空的,NOT MATCHED 条件没有被触发
  • 您的 @ColorID 变量设置为 999,但在您的临时表中,您将其设置为 101。当您将此字段用作匹配条件时,您将永远不会向 SRC 返回一行。

标签: tsql sql-server-2008 dml merge-statement


【解决方案1】:

为了详细说明 RBarry Young 和 Code Different 的响应,NOT MATCHED 将 SOURCE 中的内容与目标中的内容进行比较。因为我是从具有过滤条件的同一个表中选择的,所以源结果为 NULL,因此没有任何内容不匹配。 USING 中的代码应该是这样的

SELECT
    style = @style
    ,colour_id = @colourid
    ,size_id = @sizeid
    ,cost = @ctncost

这样,SOURCE 将包含一个带有单个记录的结果集,该记录可能会或可能不会在 TARGET 表中找到。当不匹配时,将触发插入。

感谢你们的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多