当 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) 

添加计算列几乎是即时的,因为它只是一个元数据操作。实际值是根据记录的SELECTion 计算的。由于DateDiff 操作非常快,您几乎不会注意到它。

【讨论】:

以上是关于当 SQL Server 表中的列“createdDate”从现在起经过 90 天后,如何更新其具有数百万行的列?我们可以使用触发器吗?的主要内容,如果未能解决你的问题,请参考以下文章

sql 从SQL Server中查找所有表中的列

从oracle表中选择sql server表中的列

SQL Server:复制表中的列

插入后使用 SQL Server 触发器更新另一个表中的列

根据 SQL Server 中表中的列值从两个表中获取一个新表:

使用 C# 在 ASP.NET 中检查 SQL Server 表中的列值是不是为空