【发布时间】:2018-06-20 10:34:24
【问题描述】:
我有一个主表Din_Test_Procedure:
CREATE TABLE Din_Test_Procedure(Emp_ID INT);
并且该表的审计表是:
CREATE TABLE Din_Test_Procedure_Audit(Emp_ID INT,LoopingValue BIGINT);
我为表写了一个触发器,当INSERT发生时,100万条记录插入到审计表中:
CREATE TRIGGER TrgAfterInsert_SPTest
ON [dbo].[Din_Test_Procedure]
FOR INSERT
AS
DECLARE @CurID INT, @MIN INT = 1, @MAX INT = 1000000
SELECT @CurID = i.Emp_ID
FROM inserted i;
WHILE @MIN <= @MAX
BEGIN
INSERT INTO Din_Test_Procedure_Audit
VALUES(@CurID, @MIN)
SET @MIN = @MIN + 1
END
GO
我还创建了一个带有OUTPUT 参数的存储过程来将记录插入到主表中。
CREATE PROCEDURE Din_Insert_SPTest
@ID INT, @ErrCode INT OUTPUT
AS
BEGIN
INSERT INTO Din_Test_Procedure
SELECT @ID
SELECT @ErrCode = 0
END
当我执行该过程时,它会在触发器执行完成后显示OUTPUT。给出输出需要一些时间。
DECLARE @ErrCode INT
EXEC Din_Insert_SPTest 1,@ErrCode OUTPUT
SELECT @ErrCode
是否可以在主表插入完成后获取输出,即在触发过程完成之前获取输出。
【问题讨论】:
-
您的触发器有 MAJOR 缺陷,因为您似乎认为它会每行调用一次 - 那是不是 b> 情况。触发器将每个语句触发一次,因此如果您的
INSERT语句导致此触发器触发插入 25 行,您将触发触发器一次,但随后Inserted伪表将包含 25 行。您的代码将在这 25 行中选择哪一行?SELECT @CurID = i.Emp_ID FROM inserted i;- 它是不确定的,您将获得任意行,并且您将忽略所有其他行。您需要重写触发器以考虑到这一点!
标签: sql sql-server tsql stored-procedures triggers