Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 更新触发器仅在数据已更改时更新_Sql_Sql Server - Fatal编程技术网

Sql 更新触发器仅在数据已更改时更新

Sql 更新触发器仅在数据已更改时更新,sql,sql-server,Sql,Sql Server,我有一个更新触发器,当一个记录在另一个表中更新时,它会更新空记录。我的问题是数据在gridview中,更新时,它会对网格中的所有记录运行更新查询,而不仅仅是更新的记录。因此,当触发器触发时,它会更新目标表中匹配的每一行,但我只想更新数据已更改的那一行。这是我的扳机 ALTER TRIGGER [dbo].[Trigger_update_DeSchedule] ON [dbo].[tBatchDetails] After UPDATE ,INSERT AS BEGIN SET

我有一个更新触发器,当一个记录在另一个表中更新时,它会更新空记录。我的问题是数据在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

如何在此触发器中仅更新数据已更改的记录?

这对于注释来说太长了

您应该做的第一件事是分离insert和update触发器。在单个触发器中执行这些操作几乎总是会导致问题。这肯定会给你带来麻烦。您发布的代码应该与插入时所查找的代码相同

但是,当您更新时,您需要添加一个加入到已删除。然后需要为基表中的每一列添加where谓词。了解实际值是否已更改的唯一方法是比较插入和删除的值

大概是这样的:

i.ColA <> d.ColA 
OR i.ColB <> d.ColB
etc...
i.ColA d.ColA
还是我的感冒
等
有些人可能会说使用更新功能,但这对您不起作用。如果列在要更新的值列表中,则返回true。它不在乎值是否与以前相同


当前触发器使用的是标量值。这不是一个好方法,因为触发器在每个操作中触发一次。您的代码需要基于设置。

触发器是针对每个Update语句触发的,而不是针对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

为什么我们要加入DeSChedule,而这正是我们试图更新其中记录的表?@llerdal google
SQL Server使用联接进行更新的语法
Thanks由于加入到您正在更新的表中,使得更新更容易。这仍然会更新每个记录的已完成样本列,即使乙醇和葡萄糖是空@阿里先生