Sql 2005 Express:这是否可以在循环插入方案中跳过After Insert触发器?

时间:2013-01-13 12:43:09

标签: sql sql-server tsql sql-server-2005

我有一个问题,有多个部分,每个部分带有N个问题。每个部分都有10个问题。我使用Answers将一组10个问题的结果保存到名为for loop的表中。此外,我有一个标准可以在所有问题都得到解答时禁用运行部分,以便加载pipleline中的下一部分。

在向'Answers'表提交10个问题时,我使用触发器计算'QuestionMaster'主表中问题总数以及Answers中保存的问题。如果两者相等,则当前部分状态为false,以便选择下一部分。

我的触发器是:

ALTER Trigger [dbo].[GetAnsweredQuestionCount]
On [dbo].[Answers]
After Insert
As
Begin
    Declare @sectionid as int
    Declare @companyid as int 
    Declare @Count_Inserted as int
    Declare @Count_remaining as int
Declare @userid as varchar(50)

Set @sectionid = (Select Top(1) SectionId from inserted)
Set @companyid = (Select Top(1) CompanyId from inserted)

Set @userid= (Select Top(1) UserId from inserted )

Set @Count_inserted = (Select count(id) from inserted where SectionId = @sectionid and companyid = @companyid and userid=@userid)

Set @Count_remaining = (Select count(id) from SectionQuestionMap where SectionId = @sectionid and companyid = @companyid and userid=@userid)

If @Count_inserted = @Count_remaining
    begin
        Update SectionCompanyRateMap Set IsCompleted =1 Where SectionId=@sectionid and CompanyId=@companyid
    end
End

我的问题是,因为我使用循环来插入记录,所以触发器太烧了10次,这是我不想要的。我想知道有没有办法跳过前9次触发器,这样,当我的所有问题都被保存时,它只会被执行一次。

2 个答案:

答案 0 :(得分:2)

第一种方法:

在完成一个插入查询中的每个部分而不是循环之后,您可以执行插入操作。因此,触发器只会运行一次。

第二种方法(如果不是第一种方法):

您可以定义一个包含标志的附加位列,并在触发器中进行检查,以确定是否应该使用触发器。

使用NOT FOR REPLICATION选项可以

触发器禁用,但我怀疑,这会对您有所帮助。所以我试着想出一种像第一种/第二种方法所描述的方式。

答案 1 :(得分:0)

另一个选项和简单示例

IF OBJECT_ID('dbo.test10') IS NOT NULL DROP TABLE dbo.test10
CREATE TABLE dbo.test10
 (
  Id int IDENTITY
  )
GO  

CREATE TRIGGER dbo.tr_test10 ON dbo.test10
FOR INSERT
AS
BEGIN
  SELECT 'Catch!' AS ColumnInTrigger
END
GO

SELECT Id AS [Start]
FROM dbo.test10

DECLARE @dsql nvarchar(max),
        @i int = 1
SET @dsql = 'DISABLE TRIGGER dbo.tr_test10 ON dbo.test10'
EXEC sp_executesql @dsql

WHILE (@i != 10)
BEGIN
  IF @i = 9
  BEGIN
    SET @dsql = 'ENABLE TRIGGER dbo.tr_test10 ON dbo.test10'
    EXEC sp_executesql @dsql        
  END

  INSERT dbo.test10
  DEFAULT VALUES

  SET @i += 1
END

SELECT Id AS [End]
FROM dbo.test10

SQLFiddle上的演示

相关问题