2017-08-29 48 views
0

我一直在搜索有關我的問題,但我沒有找到任何相關的。大容量插入與選擇和過程 - SQL Server

我正在執行啓用標誌FIRE_TRIGGERS的大容量插入。

所以,我需要將我的批量插入中的每一行傳遞給一個過程。

當我按行執行插入行時,我的觸發器工作正常,但是當我執行批量插入時,我的觸發器不起作用。

我的觸發代碼:

ALTER TRIGGER [dbo].[tgSetDetails] 
    ON [PORTALSQLDB].[dbo].[BurnTimeRawData] 
    AFTER INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @ServiceTag varchar(10); 
    DECLARE @Platform varchar(50); 

    SELECT 
     @ServiceTag = ServiceTag, 
     @Platform = Platform 
    FROM 
     inserted 

    EXEC spBurnTimeInsertData @ServiceTag, @Platform 
END 

任何想法,我怎麼可以做這個工作?

謝謝:)

+0

有人問過這裏的問題,不確定答案是否有關? https://stackoverflow.com/questions/17759718/bulk-insert-with-fire-triggers-not-execute-the-trigger你的觸發器只能處理一個記錄,而不是一次處理,所以它可能是問題。 – Leonidas199x

+0

@ Leonidas199x好吧,我知道觸發器只能處理一個記錄,我能做些什麼呢? –

+0

編寫一個循環,對批量插入後插入的數據執行此操作? – Leonidas199x

回答

0

此觸發器將針對每個插入語句或批量插入批次觸發一次。要爲每一行調用一個proc,你需要一個遊標。

將proc代碼重構爲基於集合的操作將包含在觸發器代碼中會更好。這將表現得更好。

+0

好的,但我已經嘗試使用遊標,但我的表被阻止,並提交任何插入。你有什麼我的例子嗎? –

+0

在**觸發器**內有**遊標**可能是您在SQL Server中可能出現的最差的性能錯誤。一個觸發器應該*非常靈活,小巧,快速* - 它不應該做任何繁重的提升或廣泛的處理,因爲它運行在調用代碼的上下文中,導致觸發器觸發,並且該代碼贏得' t能夠完成它的操作,直到觸發完成,也是..... –

+0

@JoseFelipeBlumdeAraujo,我提到的基於集合的方法是最好的。有關使用遊標提高性能的具體建議,您需要將表示,索引和proc代碼與DDL一起添加到您的問題中。一般的例子在這裏太寬泛了。 –