合并语句:在临时表中输入记录值,而不是DELETE

时间:2011-07-19 19:55:11

标签: tsql sql-server-2008

我正在使用以下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语句执行此操作的方法吗?

谢谢!

2 个答案:

答案 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是一个集合语句,如DELETEUPDATE,并且它使用这些关键字的事实并不意味着它实际上分别为每行调用相应的语句

所以,如果我是你,我会忘记从MERGE调用程序。相反,作为一种选择,我会考虑将存储过程的逻辑移动到触发器(AFTER DELETEINSTEAD OF DELETE,具体取决于具体情况)。当然,这意味着我必须在触发器 中的光标中运行复杂的逻辑,这通常是令人反感的,但在极少数情况下是必要的邪恶