【问题标题】:Trigger to Truncate then Insert rows触发截断然后插入行
【发布时间】:2013-10-06 22:49:48
【问题描述】:

每天,都会将一些行插入到 SQL Server 表 (T_PAST) 中。这些行将是过去(即 2013 年 8 月 1 日)的记录以及将来的记录(即 2014 年 1 月 1 日)。我想将过去的日期记录留在表中(T_PAST),但对于未来的日期记录,我想: 1)从原始表中删除它们 2)将它们插入到只有未来日期记录的新表中(T_FUTURE)

问题是,未来的日期记录可能会在列中发生更改,因此我宁愿截断 T_FUTURE 表并重新插入记录,而不是运行更新查询。

在正确的记录被插入到 T_PAST 中,正确的记录从 T_PAST 中删除并且 T_FUTURE 表被截断的意义上,一切正常。我的问题是,当我插入多个未来日期记录时,T_FUTURE 表中只显示最后一条记录,而不是全部。

ALTER TRIGGER [dbo].[trg_GetFuture]
ON [dbo].[T_PAST]
AFTER INSERT
AS

BEGIN
TRUNCATE TABLE dbo.T_FUTURE
END

BEGIN
INSERT INTO dbo.T_FUTURE
SELECT *
FROM INSERTED
WHERE DATE > GETDATE()
END

BEGIN
DELETE FROM dbo.T_PAST
WHERE DATE > GETDATE()
END

谢谢!!

【问题讨论】:

  • 你在哪里插入T_FUTURE?提示:您可能希望在程序开头附近添加declare @Now as DateTime = GetDate();,然后使用@Now。否则,当GetDate() 的值从INSERT 更改为DELETE 时,您可能会遇到一些难以发现的计时错误。
  • 抱歉,打错了 - 它现在显示我插入 T_FUTURE 的位置。另外,感谢您对声明的提醒。

标签: sql sql-server triggers insert truncate


【解决方案1】:

这是因为您正在截断触发器中的 T_FUTURE 表。 每次触发触发器时,它都会首先截断 T_FUTURE 表,然后将新记录插入到该表中。

【讨论】:

  • 是的,我也意识到了这一点。我认为触发器只有在插入所有行后才会触发,所以它只会截断一次,然后添加所有行,但我猜不是这样。关于如何解决这个问题的任何想法?
猜你喜欢
  • 2013-01-21
  • 2013-08-21
  • 1970-01-01
  • 2012-03-30
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多