我有一个问题,有多个部分,每个部分带有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次触发器,这样,当我的所有问题都被保存时,它只会被执行一次。
答案 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上的演示