Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 从停止SQL的位置恢复WHILE循环_Sql Server_Tsql_While Loop - Fatal编程技术网

Sql server 从停止SQL的位置恢复WHILE循环

Sql server 从停止SQL的位置恢复WHILE循环,sql-server,tsql,while-loop,Sql Server,Tsql,While Loop,我有一个while循环查询,我只想每天运行到晚上11点——我知道这可以通过WAITFOR语句实现,然后结束查询 但是,在第二天,当我重新运行查询时,我希望它从上次运行时停止的位置继续运行。因此,我正在考虑创建一个日志表,其中将包含最后处理的ID 我怎样才能做到这一点 DECLARE @MAX_Value BIGINT = ( SELECT MAX(ID) FROM dbo.TableA ) DECLARE @MIN_Value BIGINT = ( SELECT MIN(ID) FROM d

我有一个while循环查询,我只想每天运行到晚上11点——我知道这可以通过WAITFOR语句实现,然后结束查询

但是,在第二天,当我重新运行查询时,我希望它从上次运行时停止的位置继续运行。因此,我正在考虑创建一个日志表,其中将包含最后处理的ID

我怎样才能做到这一点

DECLARE @MAX_Value BIGINT  = ( SELECT MAX(ID) FROM dbo.TableA )

DECLARE @MIN_Value BIGINT = ( SELECT MIN(ID) FROM dbo.TableA )

            WHILE (@MIN_Value < @MAX_Value )
            BEGIN

                INSERT INTO dbo.MyResults
                /* Do some processing*/
                ….
                ….
                ….

                SET @MIN_Value = MIN_Value + 1

            /*I only want the above processing to run until 11PM*/

            /* Once it’s 11PM, I want to save the last used @MIN_Value 
            into my LoggingTable (dbo.Logging) and kill the above processing.*/

        /* Once I re-run the query I want my processing to restart from the
 above @MIN_Value which is recorded in dbo.Logging */

            END

免责声明:我不建议在SQL Server中使用WHILE循环,但考虑到您希望在SQL中使用解决方案的评论,请看:

-- First of all, I strongly recommend using a different way of assigning variable values to avoid scenarios with the variable being NULL when the table is empty, also you can do it in a single select.

-- Also, if something started running at 10:59:59 it will let the processing for the value finish and will not simply rollback at 11.

CREATE TABLE dbo.ProcessingValueLog (
    LogEntryId BIGINT IDENTITY(1,1) NOT NULL,
    LastUsedValue BIGINT NOT NULL,
    LastUsedDateTime DATETIME NOT NULL DEFAULT(GETDATE()),
    CompletedProcessing BIT NOT NULL DEFAULT(0)
)

DECLARE @MAX_Value BIGINT = 0;
DECLARE @MIN_Value BIGINT = 0;

SELECT
    @MIN_Value = MIN(ID),
    @MAX_Value = MAX(ID)
FROM
    dbo.TableA

SELECT TOP 1
    @MIN_Value = LastUsedValue
FROM
    dbo.ProcessingValueLog
WHERE
    CompletedProcessing = 1
ORDER BY
    LastUsedDateTime DESC

DECLARE @CurrentHour TINYINT = HOUR(GETDATE());
DECLARE @LogEntryID BIGINT;

WHILE (@MIN_Value < @MAX_Value AND @CurrentHour < 23)
BEGIN

    INSERT INTO dbo.ProcessingValueLog (LastUsedValue)
    VALUE(@MIN_Value)

    SELECT @LogEntryID = SCOPE_IDENTITY()

    // Do some processing...

    SET @MIN_Value = @MIN_Value + 1;

    UPDATE dbo.ProcessingValueLog
    SET CompletedProcessing = 1
    WHERE LogEntryId = @LogEntryID

    SET @CurrentHour = HOUR(GETDATE())
END

在回答这个问题之前。。。在我看来,你试图用一种错误的解决方案来解决你的实际问题。通过实现这个WHILE循环,您试图解决什么问题?你在运行SQL Server吗?是的,我在使用SQL Server。我知道我可以创造一份工作来做这件事。但是我想用T-SQL解决它。你的循环应该解决的实际问题是什么?用例业务场景是什么?你在处理什么/计算什么吗?好的,知道了,将用SQL回答。什么是当前的_标识?你是说现在的身份?通常,这是一个更好的选择,因为它仅限于当前会话和范围。在这个例子中,另一个过度使用的方法是子句。@habooops,我是说SCOPE\u IDENTITY。。。在SO编辑器中键入,甚至没有检查语法。修正了,谢谢你指出。