2016-11-17 50 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更新到您正在更新的表中,使得它更容易更新。 –