2016-11-17 51 views
3

我有一個更新觸發器,用於在另一個表中更新記錄時更新空記錄。我的問題是,數據是在gridview中,當你更新時,它會在網格中的所有記錄上運行更新查詢,而不僅僅是更新後的記錄。所以當觸發器觸發時,它會更新目標表中匹配的每一行,但我只想更新數據已更改的那一行。這是我的觸發器。更新如果數據已更改,則僅觸發更新

ALTER TRIGGER [dbo].[Trigger_update_DeSchedule] ON [dbo].[tBatchDetails] 
    After UPDATE ,INSERT 
AS  

BEGIN 
SET NOCOUNT ON 
    DECLARE @BatchId int 
      , @Ethanol varchar(10) 
      , @Glucose varchar(10) 
      , @SampleAge varchar(10); 

    SELECT @BatchId = B.[BatchID] 
     ,@Ethanol = [Ethanol] 
     ,@Glucose= [Glucose] 
     ,@SampleAge = SA.SampleAge 
    from INSERTED bd 
     INNER JOIN [dbo].[tSampleAge] sa ON SA.SampleAgeID = BD.SampleAge 
     INNER JOIN [dbo].[tBatch] b ON B.ID =BD.ID 

    UPDATE [dbo].[DeSchedule] 
    SET [Ethanol] = @Ethanol 
     , [Glucose] = @Glucose 
     , [SampleCompleted] = 1 
    WHERE [BatchID] = @BatchId 
     AND [SampleAge] = @SampleAge 
     AND SiteID = 6 
     AND SampleCompleted IS NULL 

END 

如何在此觸發器中只更新數據已更改的記錄?

+0

[**嘗試具有一下觸發器**代替-的](https://technet.microsoft.com/en-us/library/ms175521(V = SQL.105)的.aspx) –

回答

0

這太長了評論。

你應該做的第一件事是分開你的插入和更新觸發器。在一個觸發器中執行它們幾乎總是會導致問題。這肯定會給你帶來麻煩。您發佈的代碼應該在插入時執行您正在查找的內容。

但是,當您更新時,您需要添加要刪除的連接。然後,您需要爲基表中的每個列添加謂詞。知道實際值是否已更改的唯一方法是比較插入和刪除的值。

事情是這樣的:

i.ColA <> d.ColA 
OR i.ColB <> d.ColB 
etc... 

可能有人會說使用更新的功能,但是這不會爲你工作。如果列處於正在更新的值列表中,它將返回true。它不關心這個值是否和以前一樣。

而您當前的觸發器正在使用標量值。這不是一個好的方法,因爲每次操作觸發器觸發一次。您的代碼需要基於設置。

0

對於每個Update語句觸發器不是針對更新語句中的每一行觸發的,在觸發器中使用變量將會在更新更新多行時發生失敗/損壞的數據。

ALTER TRIGGER [dbo].[Trigger_update_DeSchedule] ON [dbo].[tBatchDetails] 
    After UPDATE ,INSERT 
AS  

BEGIN 
SET NOCOUNT ON 

    -- Correct the Alias in the set clause I am not sure what is coming from where 
    UPDATE S      
    SET S.[Ethanol] = [Ethanol] 
     , S.[Glucose] = [Glucose] 
     , S.[SampleCompleted] = 1 
    from INSERTED bd 
     INNER JOIN [dbo].[tSampleAge] sa ON SA.SampleAgeID = BD.SampleAge 
     INNER JOIN [dbo].[tBatch]  b ON B.ID =BD.ID 
     INNER JOIN [dbo].[DeSchedule] s ON s.[BatchID] = B.[BatchID] 
             AND s.[SampleAge] = BD.SampleAge 
    WHERE SiteID = 6 
     AND SampleCompleted IS NULL 

END 
+0

當我們試圖更新記錄時,爲什麼我們要加入DeSChedule? – llerdal

+1

@llerdal google'用於更新連接的SQL Server語法謝謝 –

+0

由於JOIN更新到您正在更新的表中,使得它更容易更新。 –