gpt4 book ai didi

sql - 更新触发器仅在数据更改时更新

转载 作者:行者123 更新时间:2023-12-02 03:09:41 26 4
gpt4 key购买 nike

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

如何在这个触发器中只更新数据发生变化的记录?

最佳答案

评论太长了。

您应该做的第一件事是将插入和更新触发器分开。在一个触发器中执行它们几乎总是会导致问题。这肯定会给你带来麻烦。您发布的代码应该在您插入时执行您要查找的内容。

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

像这样:

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

有些人可能会说使用 UPDATE 函数,但这对你不起作用。如果该列在正在更新的值列表中,则返回 true。它不关心值是否与以前相同。

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

关于sql - 更新触发器仅在数据更改时更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40663613/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com