sql server 触发器一个结果集变化更新到新表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql server 触发器一个结果集变化更新到新表相关的知识,希望对你有一定的参考价值。

您好,我的需求是这样的:
我要将一个结果集插入到一张新表中
INSERT INTO Temp_Qty_Tranin(Style,SumQty,SumTranin)

SELECT TDefSku.Style,SUM(TAccStock.Qty) '总库存',SUM(TAccStock.Tranin-TAccStock.TranOut) '累进量' FROM TAccStock,TDefSku WHERE
TDefSku.Sku=TAccStock.Sku group by TDefSku.Style
这个没问题了,我现在想要的结果是,这个结果集变化了(就是有新数据或者更新了)就更新那张新表(Temp_Qty_Tranin),请问怎么做!先删除新表数据这种方式不行,数据量很大!

用触发器吧

create TRIGGER [dbo].[T_UpdateSumTranin]
   ON  dbo.TAccStock 
   AFTER INSERT,UPDATE,DELETE
AS 
BEGIN
SET NOCOUNT ON;
-- 首先将有变化的数据在temp表中删除
DELETE A FROM Temp_Qty_Tranin A INNER JOIN 
(SELECT Style FROM INSERTED
UNION
 SELECT Style FROM DELETED
)B ON A.Style=B.Style
--然后将变化的数据重新计算后保存进temp
INSERT INTO Temp_Qty_Tranin(Style,SumQty,SumTranin) 

SELECT TDefSku.Style,SUM(TAccStock.Qty) '总库存',SUM(TAccStock.Tranin-TAccStock.TranOut) '累进量' FROM TAccStock,TDefSku 
WHERE 
TDefSku.Sku=TAccStock.Sku
AND TDefSku.Style IN(SELECT Style FROM INSERTED UNION SELECT Style FROM DELETED)
group  by  TDefSku.Style
END

追问

Style 无效!!!
你写的Style 是那张表的呢 ?能不能帮忙帮到底!感谢

追答create TRIGGER [dbo].[T_UpdateSumTranin]
   ON  dbo.TAccStock 
   AFTER INSERT,UPDATE,DELETE
AS 
BEGIN
SET NOCOUNT ON;
-- 首先将有变化的数据在temp表中删除
DELETE A FROM Temp_Qty_Tranin A INNER JOIN 
(SELECT B.Style FROM INSERTED A INNER JOIN TDefSku B ON A.Sku=B.Sku
UNION
 SELECT B.Style FROM DELETED A INNER JOIN TDefSku B ON A.Sku=B.Sku
)B ON A.Style=B.Style
--然后将变化的数据重新计算后保存进temp
INSERT INTO Temp_Qty_Tranin(Style,SumQty,SumTranin) 

SELECT TDefSku.Style,SUM(TAccStock.Qty) '总库存',SUM(TAccStock.Tranin-TAccStock.TranOut) '累进量' FROM TAccStock,TDefSku 
WHERE 
TDefSku.Sku=TAccStock.Sku
AND TDefSku.Style IN(SELECT B.Style FROM INSERTED A INNER JOIN TDefSku B ON A.Sku=B.Sku
            UNION
         SELECT B.Style FROM DELETED A INNER JOIN TDefSku B ON A.Sku=B.Sku)
group  by  TDefSku.Style
END

参考技术A --清空数据
truncate table Temp_Qty_Tranin

--插入数据
INSERT INTO Temp_Qty_Tranin(Style,SumQty,SumTranin)
SELECT TDefSku.Style,SUM(TAccStock.Qty) '总库存',SUM(TAccStock.Tranin-TAccStock.TranOut) '累进量' FROM TAccStock,TDefSku WHERE
TDefSku.Sku=TAccStock.Sku group by TDefSku.Style
参考技术B 是,这个结果集变化了(就

sql server 数据库里设置了当插入数据时,便触发器插入更新时间,但我导入数据时,触发器却没有工作。

怎么办啊?

参考技术A 你的表(假设表A)触发器没有问题。走一个小弯路吧。
新建一个中间表(表B),在这个表上创建触发器,当向B表插入数据时,向A表对应的列插入同一数据。
试试这样,应该就可以更新时间本回答被提问者和网友采纳
参考技术B 没有工作,那就是你触发器写的有问题。

你修改可以触发触发器。不代表你插入数据时的触发器对。
你单独用语句插入一个数据,看看触发器更新了吗。
参考技术C 你可以尝试,先把文本导入到新的文件下,然后用INSERT语句将新文本数据导入到你想导入的文件数据里 参考技术D 可以把你的触发器 代码 帖出来吗? 因为sql server 的触发器不是 行级 触发器, 你手工插入的时候 是一行一行操作的,但是 导入数据的时候 是批量执行哦,不知道你的触发器里面考虑过这个没有

以上是关于sql server 触发器一个结果集变化更新到新表的主要内容,如果未能解决你的问题,请参考以下文章

sql server 数据库里设置了当插入数据时,便触发器插入更新时间,但我导入数据时,触发器却没有工作。

SQL Server 触发器触发 3 次

如果存储过程在 SQL Server 2005 上的选择之前进行更新,则没有结果集

如何使用 SQL Server 更新触发器中的原始值更改第二条记录

如何在sql server中获取更新的列名

迁移到新的 SQL Server 后,在 MS Access 中更新链接表的最佳方法是啥?