如何在表格中的时间t之后更改字段数据?

时间:2017-12-26 11:10:23

标签: sql sql-server

是否可以在时间i后自动更改表格中的数据 假设时间i = 10秒。 表t,列x1,x2,x3 x3是boolean as datatype。

将x3为假

现在假设我将t.x3(任意行)中的值更改为True,然后在10秒后将其自身更改为False。

有可能。?通过一些触发器或光标或程序或什么?
Alteast需要一个关键字来谷歌。 谢谢!

3 个答案:

答案 0 :(得分:2)

您可以在没有触发器的情况下执行此操作。只需使用计算列。

例如:

create table t (dte datetime,
                flag as (case when dte < dateadd(second, -10, getdate()) then 0 else 1
                         end)
               );

这是一个计算列。它会在查询时重新计算,进行您要求的计算。

答案 1 :(得分:1)

您要求看起来像反模式的这种情况。存在等待随机时间(WAITFOR DELAY '00:00:02';)的命令,但通常是is not a good idea to use it

  

<强>小心+

     

包含WAITFOR会减慢SQL Server进程的完成速度,并可能导致应用程序中出现超时消息。如有必要,请在应用程序级别调整连接的超时设置。

在我看来,简单的方法是在桌面上创建一个视图并动态计算字段:

CREATE TABLE t ( PrimaryKey ....,
                 x3 bit, 
                 t datetime default gettime(), 
               );

CREATE VIEW v as
SELECT PrimaryKey,
       (CASE WHEN x3 = 1 and datediff(second,  t, getdate()) > 10 
             THEN 1 
             ELSE 0 
        END ) as x3  --<-- lets supose this is your field.
FROM t;

然后,您可以从视图中选择以检查您的计算字段:

SELECT x3 FROM v; --<-- select from v instead from t.

您可以使用触发器在更改x3时保持t字段最新:

CREATE TRIGGER updateModified
ON dbo.t
AFTER UPDATE 
AS
   UPDATE dbo.t
   SET t = getdate()
   FROM Inserted i
   WHERE dbo.t.PrimaryKey = i.PrimaryKey

答案 2 :(得分:0)

您可以使用触发器在表格上发生变化后自动更新值。但是,在更新/插入/删除后直接执行触发器时,此更改将在几毫秒内受到影响。

您可以执行的第二种方法是创建一个计划的数据库作业,该作业将每10秒运行一次(在这种情况下)或任何特定的间隔,这将在所需的列中进行更新。

有关安排数据库作业的更多信息,请参阅此Article