【问题标题】:SQL Trigger to Call a Stored Procedure with inserted value as parameterSQL 触发器调用以插入值作为参数的存储过程
【发布时间】:2018-02-14 15:38:49
【问题描述】:

我想监视一个表的插入并使用已插入的值调用一个存储过程。

监控表 (BatchDetails) 将具有以下列 BatchID,BatchStartTime,BatchEndTime

存储过程将使用已插入的最新 BatchID

注意: 一次只能插入一行。

我一直在查看此链接,但似乎有很多事情发生,即几张桌子。有没有一种简单的方法可以做到这一点?

Call stored proc from after insert trigger

【问题讨论】:

  • 插入可以影响 多个 行,并且每个语句触发一次,而不是每行触发一次。通常,您应该将(少量)逻辑放入触发器,而不是调用存储过程。存储过程做什么
  • 一次只能插入一行。插入的行永远不会超过一行。
  • 在我看来,您链接到自己的问题包含回答问题所需的所有信息,只要您花时间研究一下即可。
  • “注意:每次只能插入一行。” 就是这样的想法会让未来的你讨厌现在的你3、6 ,或者从现在起 12 个月后,当有人决定更改它并在单个语句中插入一堆行时......

标签: sql sql-server stored-procedures triggers sql-insert


【解决方案1】:

您可以使用这样的触发器:

CREATE TRIGGER TR_Monitor_BatchDetails_Inserts 
    ON BatchDetails
AFTER INSERT
AS 
BEGIN 
    DECLARE @BatchId INT
    SELECT TOP 1 @BatchId = BatchId
    FROM    INSERTED
    ORDER BY [PK_ColumnHere/Date/OtherOrderingColumn] DESC

    EXEC    SomeStoredProc @BatchId
END

但它有一些缺陷:

1 - INSERTED 中可以有更多行(正在插入的行),这不会处理所有行

2 - 您可能希望从插入到BatchDetails 表的位置调用您的过程。也许有一个执行插入的过程,并在那里添加对该过程的调用。这将是解决此问题的更好方法。

希望有意义

【讨论】:

  • 如果您要编写一个只能处理单行插入的触发器,我通常会坚持它包含一个针对该前提条件的 check 并引发错误如果没有满足。否则,当他们开始执行多行插入时,它会在(6 个月、一年等)之后等待咬人。
【解决方案2】:

详细说明先前的答案并考虑插入超过 1 行,您可以尝试这样的操作:

CREATE TRIGGER TR_Monitor_BatchDetails_Inserts 
    ON BatchDetails
AFTER INSERT
AS 
BEGIN 
    DECLARE @BatchId INT
    Declare bcursor cursor local for
    SELECT BatchId FROM INSERTED ORDER BY [PK_ColumnHere/Date/OtherOrderingColumn] DESC
    open bcursor
    fetch next from bcursor into @BatchId
    while @@FETCH_STATUS = 0 begin
        EXEC    SomeStoredProc @BatchId
        fetch next from bcursor into @BatchId
    end
    close bcursor
    deallocate bcursor
END

【讨论】:

猜你喜欢
  • 2013-01-21
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多