当 SQL Server 表中的列“createdDate”从现在起经过 90 天后,如何更新其具有数百万行的列?我们可以使用触发器吗?
Posted
技术标签:
【中文标题】当 SQL Server 表中的列“createdDate”从现在起经过 90 天后,如何更新其具有数百万行的列?我们可以使用触发器吗?【英文标题】:How to update a column in a SQL Server table with millions of rows when its column "createdDate" passes 90 days from now? Can we use trigger? 【发布时间】:2016-12-27 05:50:14 【问题描述】:我有一张包含数百万行的表格。我有一列应该在记录创建后 90 天设置为 true。我有一个createdDate
列来跟踪创建日期。如何处理大表?
【问题讨论】:
使用每天运行一次并检查日期的事件(在几乎没有数据库活动的时间) 当表中已经有 CreatedDate 时,将另一列设置为 true 有什么意义?只需改用 CreatedDate。 【参考方案1】:由于应根据创建日期更新列,因此您需要将查询放入作业中并每天安排它。您可以使用以下查询来更新列值。
添加SQL代码以运行每日作业的链接:how to schedule a job for sql query to run daily?
Update Column='yourvalue'
From TableName T
Where DateDiff(DD,T.CreateDate,Getdate())>90
【讨论】:
所以我应该手动运行它?我想要在日期差为 90 天时像触发器一样自动运行的东西。 @OLDRomeo 即使更新应该在日期差为 90 天时进行,但日期差的计算应该每天进行。您不必手动运行它。您只需创建一个SQL Server 代理中的新作业,您必须每天放置此查询并安排它。我已经更新了上面的解决方案,其中包含如何安排 SQL 查询作业每天运行的链接 简单明了。没有什么复杂的,即使表很大,它也可以批量处理。【参考方案2】:即使是大数据库,也最好运行 SQL 命令来更新查询。
【讨论】:
【参考方案3】:为什么不简单地使用计算列?这样,值将始终正确,而无需定期运行(昂贵的)更新。
CREATE TABLE t_my_table (row_id int IDENTITY (1,1) PRIMARY KEY,
value_x int NOT NULL,
value_y int NOT NULL,
createDate datetime NOT NULL,
is_90_days AS (CASE WHEN DateDiff(day, createDate, CURRENT_TIMESTAMP) >= 90 THEN Convert(bit, 1) ELSE Convert(bit, 0) END)
)
GO
INSERT INTO t_my_table
(value_x, value_y, createDate)
VALUES (10, 100, '18 aug 2016'),
(20, 200, '25 nov 2016'),
(30, 300, '12 dec 2016'),
(40, 400, '14 may 2017')
GO
SELECT * FROM t_my_table
要将计算列添加到已经存在的表中,请使用以下语法:
ALTER TABLE t_my_table ADD is_90_days AS (CASE WHEN DateDiff(day, createDate, CURRENT_TIMESTAMP) >= 90 THEN Convert(bit, 1) ELSE Convert(bit, 0) END)
添加计算列几乎是即时的,因为它只是一个元数据操作。实际值是根据记录的SELECT
ion 计算的。由于DateDiff
操作非常快,您几乎不会注意到它。
【讨论】:
以上是关于当 SQL Server 表中的列“createdDate”从现在起经过 90 天后,如何更新其具有数百万行的列?我们可以使用触发器吗?的主要内容,如果未能解决你的问题,请参考以下文章