创建触发器以将数据从一个表获取到另一个表并生成时间戳
Posted
技术标签:
【中文标题】创建触发器以将数据从一个表获取到另一个表并生成时间戳【英文标题】:Creating Trigger to get data from one table to another and generating a timestamp 【发布时间】:2021-12-18 17:51:22 【问题描述】:我正在尝试跟踪将在 Excel 表 (SQL Spreads) 中输入数据的库存,然后更新 SQL 表,然后收集该数据的总和并将其放到另一个表中,然后生成时间戳到何时它已更改/更新/插入。 带有突出显示列的图片是我想要在其中包含数据的地方。
(TotalBinLo --> Binlocation)
and then when Binlocation is populated (inserted/updated/deleted) generating a timestamp (MM/DD/YYYY HH:MM:SS)
这就是我到目前为止所提出的。
---This Trigger is working when pulling data from one table into another--
Create Trigger tr_BC_totalbinLoc
on bincount
After Update
AS
Begin
update OnHandInv
set OnHandInv.binlocation = bincount.totalbinlo
from bincount
inner join OnHandInv on bincount.partnumber = OnHandInv.PartNumber;
End
---另一个触发器(有效),但输入所有行的日期。 (不要)(只需要一栏。)
Create Trigger tr_totalbinLoc_OHI
On Onhandinv
After Update
AS
Update Onhandinv
set dateupdated = getutcdate()
where PartNumber in (select distinct PartNumber from onhandinv)
totalbinlo ColNeedToPopu
【问题讨论】:
为什么您的两个触发器都没有引用inserted
或 deleted
对象?
@LSerni 这是我试图用我能够总结的数据做的事情。
@Larnu 我可以把它放在我的触发器中。我只是没有得到那么远的atm。我还在学习,所以我会尝试分步做事,以防万一我做了一件事,然后刹车或绊倒另一件事。
“但输入所有行的日期” 因为,同样,您没有引用 inserted
/deleted
。当然,它会影响每一行;这就是你告诉它要做的事情。 onhandinv.PartNumber in (select distinct PartNumber from onhandinv)
也完全没有意义。这将评估为 TRUE,除非 PartNumber
的值为 NULL
。该子句也可以是PartNumber IS NOT NULL
。
@Larnu 我明白了,我会使用“IF THEN”子句吗?
【参考方案1】:
您需要将inserted
表加入OnHandInv
。我假设PartNumber
是加入的主键。
您还需要删除完全匹配的 deleted
行,即实际上没有进行任何更改的行。
CREATE OR ALTER TRIGGER tr_BC_totalbinLoc
ON bincount
AFTER UPDATE
AS
SET NOCOUNT ON;
IF NOT EXISTS (SELECT 1 FROM inserted)
RETURN;
UPDATE o
SET
binlocation = i.totalbinlo
dateupdated = getutcdate()
FROM (
SELECT partnumber, totalbinlo
FROM inserted i
EXCEPT
SELECT partnumber, totalbinlo
FROM deleted d
) i
INNER JOIN OnHandInv o ON i.partnumber = i.PartNumber;
GO
【讨论】:
这确实有效,但是当我在表中执行更新/插入数据时,它仍然会使用日期/时间更新整个列。 检查你的加入栏,应该是partnumber
吗?什么是主键?
PartNumber 是两个表的 PK。我将尝试使用 OnH 的 binlocation 和 binc 的 totalbinlo 并回复您。
很抱歉还需要删除deleted
行
我将连接更改为 o.Binloc 和 i.totalbin,但它会将 OnHand 中的整个 binlocation 列填充为一条记录。示例:所有行中有 500 个,并且日期仍在整个列中。以上是关于创建触发器以将数据从一个表获取到另一个表并生成时间戳的主要内容,如果未能解决你的问题,请参考以下文章
如何将行从一个 Excel 工作表复制到另一个工作表并使用 VBA 创建重复项?
如何将数据从一个表移动到另一个表并更新外键 (T-SQL 2008)