SQL触发器以插入值作为参数调用存储过程

时间:2017-09-06 08:25:02

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

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

受监控的表(BatchDetails)将包含以下列 BatchID,BatchStartTime,BatchEndTime

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

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

我一直在看这个链接,但似乎有很多事情,即几张桌子。有一种简单的方法吗?

Call stored proc from after insert trigger

2 个答案:

答案 0 :(得分:2)

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

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 - 您可能希望将插入程序所在的程序调用{​​{1}}表。也许有一个proc来执行插入操作,并在那里添加对此过程的调用。这将是一个更好的方法来解决这个问题。

希望它有意义

答案 1 :(得分:1)

详细说明上一个答案,并考虑插入多于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