Sql server 从停止SQL的位置恢复WHILE循环
我有一个while循环查询,我只想每天运行到晚上11点——我知道这可以通过WAITFOR语句实现,然后结束查询 但是,在第二天,当我重新运行查询时,我希望它从上次运行时停止的位置继续运行。因此,我正在考虑创建一个日志表,其中将包含最后处理的ID 我怎样才能做到这一点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
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编辑器中键入,甚至没有检查语法。修正了,谢谢你指出。