2013-01-13 70 views
1

我有一個問題,有多個部分,每部分帶有N個問題。每個部分分10個問題。我使用for loop將一組10個問題的結果保存到名爲Answers的表中。此外,我還有一個標準,在所有問題都得到解答時禁用運行部分,以便在pipleline中加載下一部分。SQL 2005 Express:這是可能跳過插入觸發器循環插入方案?

將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 [email protected]) 

Set @Count_remaining = (Select count(id) from SectionQuestionMap where SectionId = @sectionid and companyid = @companyid and [email protected]) 

If @Count_inserted = @Count_remaining 
    begin 
     Update SectionCompanyRateMap Set IsCompleted =1 Where [email protected] and [email protected] 
    end 
End 

我的問題是,因爲我使用循環插入記錄,以便觸發過射擊10次,這是我不想。我想知道是否有任何方法可以在前9次跳過觸發器,這樣,只有當我的所有問題得到保存時,它纔會執行一次。

+0

'(選擇頂層(1)SectionId從插入)' - 這是一個,我們應該說,*有趣*的方式來處理'inserted'可以包含多行。但爲什麼不重新編寫觸發器來正確處理多行插入(然後,如果可能的話,消除循環,並執行*多行插入) –

回答

2

第一種方法:

你可以在一個插入查詢完成各個部分,而不是循環後做插入。因此,觸發器只能運行一次。

第二條本辦法(如果第一個是不可能的):

你可以定義一個額外的比特列拿着一個標誌,並檢查這在您的觸發器來確定觸發是否應該使用與否。

觸發禁用可能與NOT FOR REPLICATION選項,但我懷疑,這會幫助你。所以我會試着想像第一種/第二種方法中描述的方式。

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