【发布时间】:2015-09-05 10:26:50
【问题描述】:
有没有办法使用指令:
MERGE INTO MySchema.MyTable AS Target
USING (VALUES
........
)
除了点之外什么都没有?通常你有一个类似(firstValue,SecondValue,...,LastValue)的列表,你想要合并的每一行都有一个,但我希望能够编写没有行的指令,以便删除部分MERGE 删除所有行。
这是因为我使用的存储过程会自动创建 MERGE 指令,但有时我开始的表是空的。
当然我试过了:
MERGE INTO MySchema.MyTable AS Target USING (VALUES)
但它不被接受。
例子:
MERGE INTO [dbo].[MyTable] AS Target
USING (VALUES (1,'Attivo') ,(2,'Disabilitato') ,(3,'Bloccato') ) AS Source ([IDMyField],[MyField]) ON (Target.[IDMyField] = Source.[IDMyField])
WHEN MATCHED AND ( NULLIF(Source.[MyField], Target.[MyField]) IS NOT NULL OR NULLIF(Target.[MyField], Source.[MyField]) IS NOT NULL)
THEN UPDATE SET [MyField] = Source.[MyField]
WHEN NOT MATCHED BY TARGET
THEN INSERT([IDMyField],[MyField]) VALUES(Source.[IDMyField],Source.[MyField])
WHEN NOT MATCHED BY SOURCE
THEN DELETE;
【问题讨论】:
-
请发布您正在使用的整个 MERGE 语句的实例 is 工作,即 USING 子句有一些值。 (我之所以问,是因为我在 MERGE 文档中没有看到任何允许在 USING 子句中使用关键字 VALUES 的内容。)
-
如果你只是想删除为什么不使用删除语句?
-
合并到 [dbo].[MyTable] 作为目标使用 (VALUES (1,'Attivo') ,(2,'Disabilitato') ,(3,'Bloccato') ) 作为源 ([ IDMyField],[MyField]) ON (Target.[IDMyField] = Source.[IDMyField]) WHEN MATCHED AND ( NULLIF(Source.[MyField], Target.[MyField]) 不为 NULL 或 NULLIF(Target.[MyField] , Source.[MyField]) IS NOT NULL) THEN UPDATE SET [MyField] = Source.[MyField] WHEN NOT MATCHED BY TARGET THEN INSERT([IDMyField],[MyField]) VALUES(Source.[IDMyField],Source.[ MyField]) 当源不匹配时删除;
-
很抱歉,即使使用最后两个空格作为 ,我也无法添加换行符,就像帮助中所述...
-
@SeanLange:当然我不“只是”想删除,否则是的,我会使用 DELETE。你的评论就像“如果你想用轮子移动,为什么不使用自行车而不是飞机?” -> 因为我也想飞,自行车是带轮子的,但一般来说,不允许我飞。我需要的是一个完整的 MERGE,它还可以处理源表没有行并且我需要目标表没有行但我也希望能够更新和插入的情况:这就是 MERGE 应该是什么用于。
标签: sql-server tsql merge