1

我有一个问卷,有多个部分,每个部分有 N 个问题。每个部分都有 10 个问题。我正在将一组 10 个问题的结果保存到Answers使用for loop. 另外,我有一个标准来在所有问题都得到回答时禁用正在运行的部分,以便在管道中加载下一个部分。

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

我的触发器是:

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 次触发器,这样,当我的所有问题都保存时,它只会执行一次。

4

2 回答 2

2

第一种方法:

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

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

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

使用NOT FOR REPLICATION选项可以禁用触发器,但我怀疑这会对您有所帮助。因此,我会尝试考虑一种类似于第一种/第二种方法中描述的方法。

于 2013-01-13T14:55:51.160 回答
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上的演示

于 2013-01-16T15:37:58.953 回答