Sql 合并不插入新值
我试图使用MERGE将新值插入到一个表中,前提是它们在同一个表中不存在 这是我正在使用的查询: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 [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
提示