如何在一段时间后运行SQL脚本而不等待它?

时间:2013-09-02 11:46:34

标签: sql asp-classic delay delayed-execution

我正在尝试创建一个有延迟的SQL脚本。

我可以使用:

blah blah
WAITFOR DELAY '00:30:00'
blah blah

但是使用这样的脚本要求我坐30分钟。

离开网站将取消脚本。


问题是我想要更改表中的某些内容,然后在30分钟后自动将其更改回来。

进行更改的人将离开网页,因此任何类型的客户端脚本都是不可能的。

如果30分钟过后,我也不能等待此人返回并进行更改,无论如何,更改必须在30分钟后发生。


如果没有在服务器上提供服务或任何其他程序,有没有这样做?

仅使用ASP / SQL编程。

如果无法做到这一点,如何在服务器上进行服务程序进行此更改?

必须能够使用ASP从网站开始。

3 个答案:

答案 0 :(得分:2)

我个人不会这样处理这种情况。我不确切知道您的数据结构是什么,或者为什么需要更改30分钟的内容,但我会使用“更改”表。

所以你可能有像

这样的东西

MainTable (ID,Column1,Column2,Column3,Column4);

ChangeTable (ID,Column1,Column2,Column3,Column4,CreatedDateTime);

每当您进行更改而不是更新主表时,您只需将要更新的值插入ChangeTable(我假设SQL-Server基于WAITFOR)。

然后我会这样做:

CREATE VIEW dbo.MainView
AS
SELECT  m.ID,
        Column1 = ISNULL(c.Column1, m.Column1),
        Column2 = ISNULL(c.Column2, m.Column2),
        Column3 = ISNULL(c.Column3, m.Column3)
FROM    dbo.MainTable m
        OUTER APPLY 
        (   SELECT  TOP 1 c.Column1, c.Column2, c.Column3
            FROM    dbo.ChangeTable c
            WHERE   c.ID = m.ID
            AND     c.CreatedDate >= DATEADD(MINUTE, -30, GETDATE())
            ORDER BY c.CreatedDate DESC
        ) c;

然后在整个网站上参考。

如果空间有问题,您可以设置夜间作业以删除任何旧条目,例如将以下内容设置为在00:30运行

DELETE  ChangeTable
WHERE   CreatedDate < CAST(GETDATE() AS DATE);

答案 1 :(得分:1)

就个人而言,虽然这个委员会的其他人永远不会认为它是专业的...我使用网站正常运行时间监控服务来运行脚本。例如,每隔30分钟http://www.serviceuptime.com/free_monitoring.php就会出现一个你选择的asp页面。

为了便于开发,我使用不同的监视服务来加载脚本。有更多专业的方法,例如制作VBS脚本并通过任务管理器运行它,我为长时间运行的脚本执行操作,但对于像往常一样检查邮件队列这样的简单事情,我只是使用监控服务来加载页面经常足以做我想做的事。

答案 2 :(得分:0)

使用 SQL Server代理 SQL过程计算出来。

这基本上是我的代码现在的构建方式:

在表格中进行临时更改

UPDATE table SET column = 'temp_value' WHERE column = 'normal_value'

检查程序是否存在,如果是,请将其删除。创建一个过程以还原表中的更改。

IF EXISTS ( SELECT * 
    FROM sys.objects 
    WHERE object_id = OBJECT_ID(N'myRevertProcedure')
        AND type IN ( N'P', N'PC' ) )
    DROP PROCEDURE myRevertProcedure 

CREATE PROCEDURE myRevertProcedure 
    AS
    BEGIN 
        WAITFOR DELAY '00:30:00'
        UPDATE table SET column = 'normal_value' WHERE column = 'temp_value'
    END

我在运行以下内容的SQL Server代理中创建了作业

IF EXISTS ( SELECT * 
    FROM sys.objects 
    WHERE object_id = OBJECT_ID(N'myRevertProcedure')
        AND type IN ( N'P', N'PC' ) )
    BEGIN
        EXEC MyProc
        DROP PROCEDURE myRevertProcedure 
    END

作业不是简单地还原更改本身的原因是因为用户应设置延迟。

如果延迟总是30分钟,我可以让工作运行如下:

IF EXISTS (SELECT * FROM table WHERE column = 'temp_value')
    BEGIN
        WAITFOR DELAY '00:30:00'
        UPDATE table SET column = 'normal_value' WHERE column = 'temp_value'
    END

通过这样做,我不需要任何程序。

顺便说一句:这项工作每隔几秒就会运行一次。