Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql T-SQL MERGE语句没有插入新记录-我的代码有什么问题?_Tsql_Sql Server 2008_Dml_Merge Statement - Fatal编程技术网

Tsql T-SQL MERGE语句没有插入新记录-我的代码有什么问题?

Tsql T-SQL MERGE语句没有插入新记录-我的代码有什么问题?,tsql,sql-server-2008,dml,merge-statement,Tsql,Sql Server 2008,Dml,Merge Statement,下面的代码正在成功更新现有记录,但没有在细节不匹配的地方插入新记录,我不理解为什么不插入,因为代码正在编译,并且没有抛出任何错误消息。我肯定我错过了一些明显的东西。作为参考,我使用SQL Server 2008进行区分大小写的排序,但我不认为这有什么区别。我还有其他的合并案例可以很好地工作,只是这一个没有很好地发挥作用 要查看更新是否正常工作,请将调试变量声明中的colorID修改为与insert语句中的值相同 BEGIN TRY DROP TABLE #adr_test END TR

下面的代码正在成功更新现有记录,但没有在细节不匹配的地方插入新记录,我不理解为什么不插入,因为代码正在编译,并且没有抛出任何错误消息。我肯定我错过了一些明显的东西。作为参考,我使用SQL Server 2008进行区分大小写的排序,但我不认为这有什么区别。我还有其他的合并案例可以很好地工作,只是这一个没有很好地发挥作用

要查看更新是否正常工作,请将调试变量声明中的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

为了详细说明RBarry Young和Code Different的响应,NOT MATCHED将源代码中的内容与目标代码中的内容进行了比较。因为我从具有筛选条件的同一个表中进行选择,所以源结果为空,因此没有不匹配的内容。使用中的代码应该如下所示

SELECT
    style = @style
    ,colour_id = @colourid
    ,size_id = @sizeid
    ,cost = @ctncost
这样,源将包含一个结果集,其中包含一条记录,该记录可能在目标表中找到,也可能在目标表中找不到。如果不匹配,则会触发插入


谢谢你们的帮助。

你们正在合并到选择的同一个表中,它将永远不会匹配。是的,它会匹配。在上面的示例中,USING查询将返回一个空数据集,因为没有具有此@colorId的记录。因此它不匹配必须读:由Aaron Bertrand编写。我怀疑,由于您的源是空的,不匹配的条件不是triggeredYour@ColorID varable设置为999,但在临时表中,您将其设置为101。当您使用此字段作为匹配标准时,将永远不会将行返回到SRC。