我正在使用以下Merge语句:
MERGE dbo.UnitOfMeasure AS target
USING (
SELECT * FROM dbo.UnitOfMeasure
) AS src
ON
target.UOMId = src.UOMId
WHEN NOT MATCHED THEN
INSERT
(
UOMId,
UOM
)
VALUES
(
src.UOMId,
src.UOM
)
WHEN NOT MATCHED BY SOURCE THEN
DELETE <-- Do something other than delete here
WHEN MATCHED THEN
UPDATE SET
target.UOM = src.UOM;
我不想实际删除记录,而是为每个要删除的记录运行存储过程。从本质上讲,我不能简单地删除这些记录。相反,我有存储过程来处理删除给我。我只需要将唯一ID(UOMId)传递给存储过程。
任何人都知道使用Merge语句执行此操作的方法吗?
谢谢!
答案 0 :(得分:2)
如果我正确阅读文档,看来您可以使用WHEN NOT MATCHED BY SOURCE子句的唯一选项是UPDATE和DELETE:http://technet.microsoft.com/en-us/library/bb510625.aspx。
拉梅!执行程序在这里将无穷无尽!即使是INSERT也足以满足大多数场景......
尽管如此,在您的情况下,我会分两步处理这些记录。 1:将MERGE与UPDATE语句一起使用以标记要删除的字段。 2:在标记的字段上调用您的删除代码。
祝你好运!答案 1 :(得分:0)
就您的问题而言,MERGE
仅仅是一个明确的删除声明,就像DELETE
一样。我想,如果您需要对存储过程进行特殊删除处理,则不要调用DELETE FROM table WHERE condition
。同样适用于MERGE
。当然,作为语言功能,有能力从MERGE
调用SP可能会很好。但MERGE
是一个集合语句,如DELETE
或UPDATE
,并且它使用这些关键字的事实并不意味着它实际上分别为每行调用相应的语句
所以,如果我是你,我会忘记从MERGE
调用程序。相反,作为一种选择,我会考虑将存储过程的逻辑移动到触发器(AFTER DELETE
或INSTEAD OF DELETE
,具体取决于具体情况)。当然,这意味着我必须在触发器 中的光标中运行复杂的逻辑,这通常是令人反感的,但在极少数情况下是必要的邪恶