Sql 合并不插入新值

Sql 合并不插入新值,sql,sql-server,tsql,sql-server-2017,sql-merge,Sql,Sql Server,Tsql,Sql Server 2017,Sql Merge,我试图使用MERGE将新值插入到一个表中,前提是它们在同一个表中不存在 这是我正在使用的查询: MERGE [dbo].[TARGET_TABLE] AS Target USING (SELECT [NAME] FROM [dbo].[TARGET_TABLE] WHERE [NAME]='ThisValuesDoesntExists' AND [STATUS] IS NULL) AS Source ON Target.[NAME]= Source.[NAME] W

我试图使用MERGE将新值插入到一个表中,前提是它们在同一个表中不存在

这是我正在使用的查询:

MERGE [dbo].[TARGET_TABLE] AS Target 
USING 
(SELECT [NAME]
    FROM [dbo].[TARGET_TABLE] 
    WHERE [NAME]='ThisValuesDoesntExists' AND [STATUS] IS NULL) AS Source
    ON Target.[NAME]= Source.[NAME]
WHEN NOT MATCHED
    THEN INSERT ([NAME],[file_first_upload],[upload_date])
        VALUES('ThisValuesDoesntExists',1,DEFAULT);
但是当我执行它时,我得到一条(0行受影响)消息

如果执行“源”查询,则得到0行

SELECT [NAME] 
FROM [dbo].[TARGET_TABLE] 
WHERE [NAME] = 'ThisValuesDoesntExists' AND [STATUS] IS NULL
我做错了什么

谢谢

如果查看文档,您将看到源数据必须存在,才能与目标表中的现有行匹配(或不匹配):

当[目标]不匹配时,则

指定为每行将一行插入到目标_表 由上的返回,但不 匹配目标_表中的一行,但满足附加搜索 条件,如果存在。要插入的值由 条款在以下情况下,MERGE语句只能有一个 不匹配[按目标]子句

您面临的问题是,您的“源”数据没有返回任何内容,因此合并查询没有可匹配或插入的内容

下面的示例代码用于演示:

IF OBJECT_ID('dbo.TARGET_TABLE', 'U') IS NOT NULL DROP TABLE dbo.TARGET_TABLE 
GO 

CREATE TABLE TARGET_TABLE ([Name] VARCHAR(100), file_first_upload BIT, upload_date DATETIME, [STATUS] VARCHAR(100)) 

MERGE [dbo].[TARGET_TABLE] AS Target 
USING 
(SELECT [NAME]
    FROM [dbo].[TARGET_TABLE] 
    WHERE [NAME]='ThisValuesDoesntExists' AND [STATUS] IS NULL) AS Source
    ON Target.[NAME]= Source.[NAME]
WHEN NOT MATCHED
    THEN INSERT ([NAME],[file_first_upload],[upload_date])
        VALUES('ThisValuesDoesntExists',1,DEFAULT);

SELECT * 
FROM TARGET_TABLE 

MERGE [dbo].[TARGET_TABLE] AS Target 
USING (VALUES ('ThisValuesDoesntExistss',1,GETDATE())) AS Source ([Name], [file_first_upload],[upload_date])
ON Target.[NAME] = Source.[Name] 
WHEN NOT MATCHED
    THEN INSERT ([NAME],[file_first_upload],[upload_date]) VALUES (Source.[Name], Source.file_First_upload, Source.upload_date);

SELECT * 
FROM TARGET_TABLE 

TARGET\u TABLE
TARGET\u TABLE
的合并似乎有些奇怪。您正在向后思考。。。如果源表中没有行,则不存在匹配或不匹配。要获得不匹配,您需要源中的一行在目标中不存在,您已经尝试以另一种方式进行了尝试。如果您将源代码设置为静态
,它就可以工作。(不确定其中有多少仍然是当前的bug)顺便说一句,我建议对目标进行
UPDLOCK,HOLDLOCK
提示