2017-03-19 21 views
0

私は毎日11PMまで実行したいwhileループクエリを持っています。これはWAITFOR文で実現でき、クエリを終了することができます。停止したところからWHILEループを再開SQL

ただし、翌日にクエリを再実行すると、前回の実行で停止した場所から続行します。だから私は、最後に処理された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 
+1

この質問に答える前に...それが表示されますあなたの実際の問題に対して間違った種類のソリューションを使用しようとしていることを私に教えてください。このWHILEループを実装して解決しようとしている問題は何ですか? SQL Serverを実行していますか? –

+0

はい、私はSQL Serverを使用しています。私はこれを行う仕事を作ることができたことを知っています。しかし、私はT-SQLを使ってそれを解決したいと思います。 – Dias

+2

あなたのループが解決しようとしている実際の問題は何ですか?ユースケース(ビジネスシナリオ)は何ですか?あなたは何かを処理している/ものを計算していますか これで、SQLで答えます。 –

答えて

1

免責事項:私は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 
+0

'CURRENT_IDENTITY()'とは何ですか?あなたは 'IDENT_CURRENT()'を意味しましたか?原則として、現在のセッションとスコープに限定されているので、['Scope_Identity()'](https://msdn.microsoft.com/en-us/library/ms190315.aspx)ははるかに良い選択です。代替(このインスタンスでは過剰)は[OUTPUT](https://msdn.microsoft.com/en-us/library/ms177564.aspx)節です。 – HABO

+0

@HABO私はSCOPE_IDENTITY()を意味しています... SOエディタで入力していても構文をチェックしていませんでした。固定しました。指摘してくれてありがとう。 –

関連する問題