繁体   English   中英

由于合并语句而执行存储过程

[英]Executing a stored procedure as a result of merge statement

我在如下所示的存储过程中使用MERGE语句:

        MERGE Sections AS sTarget
        USING @Sections AS sSource
        ON sTarget.SectionID = sSource.SectionID
        WHEN NOT MATCHED THEN
            <INSERT STATEMENT>
        WHEN MATCHED THEN
            UPDATE SET
                IsActive = CASE WHEN sSource.IsDeleted = 1 THEN 0 ELSE 1 END;
                                                                ^
                                                                A

其中@Sections是传递给存储过程的参数。

现在我想执行一个名为spDeleteSection的存储过程,它接受SectionID作为参数并(软)删除该部分下的所有分区和细分并返回 0。我想在“A”处执行此过程。

这可以做到吗? 如果有怎么办? 如果无法完成,我应该在哪里执行以获得相同的结果?

笔记 :

  • @Sections是用户定义的表
  • SectionIDsSource.SectionID获得

您可以使用OUTPUT子句将每个合并的行捕获到表变量中。

然后只需将该表加入DELETE即可。

不要试图在这个表变量上逐行执行某些操作,它可能会很慢。 执行单个连接删除。

DECLARE @output TABLE (SectionID int PRIMARY KEY, action nvarchar(10))

MERGE Sections AS sTarget
USING @Sections AS sSource
ON sTarget.SectionID = sSource.SectionID
WHEN NOT MATCHED THEN
    <INSERT STATEMENT>
WHEN MATCHED THEN
    UPDATE SET
      IsActive = CASE WHEN sSource.IsDeleted = 1 THEN 0 ELSE 1 END
OUTPUT sTarget.SectionID, $action
  INTO @output (SectionID, action);
;

DELETE d
FROM Division d
JOIN @output o ON o.SectionID = d.SectionID
WHERE o.action = 'UPDATE';

如有必要,您可以将此表变量中的正确行转储到表值参数中,并使用该参数执行单独的过程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM