0

毎晩実行するSQLサーバにストアドプロシージャがあります。目的は、2つの日付の間の差を計算し、残りを列に入れることです。SQL文でOpen Cursorの中で条件文を実行する方法

私は以下のフィールドを持っています:期日、今日の日付、進捗状況、残りの日。私は、今日の日付と期日との差を計算し、差異を残りの日の列に保存します。

しかし、進捗列の値を確認したい場合は、進捗状況が「完了」であれば残りの日の更新をスキップします。

このようにして、ジョブが完了した場合、残りの日数は、差が今日の日付からさらに遠ざかるにつれてカウントダウンを続けることはありません。

これまで私がこれまで持っていたことは次のとおりです。これは、進行状況列の条件付きチェック以外のすべてに対して機能します。私は使用しているカーソルの中でそれを行う方法を知らない。

DECLARE @due_date DATE 
DECLARE @difference varchar(50) 
DECLARE @id INT 

DECLARE myCursor CURSOR FORWARD_ONLY FOR 
    SELECT [Engr Due] FROM dbo.Employee_Table 

OPEN myCursor 

FETCH NEXT FROM myCursor INTO @due_date 

WHILE @@FETCH_STATUS = 0 BEGIN 
    SELECT @difference = DATEDIFF(day, GETDATE(), @due_date) 
    UPDATE Employee_Table 
     SET [Remaining Days][email protected] 
     WHERE CURRENT OF myCursor 
    FETCH NEXT FROM myCursor INTO @due_date 
END 

CLOSE myCursor 
DEALLOCATE myCursor 
+6

なぜあなたはすべてでカーソルを使用していますか?これは 'update Employee_Table set [Remaining Days] = DATEDIFF(日、GETDATE()、[Engr Due])'と置き換えることができるようです。 – Blorgbeard

+0

'Progress'のことは' Progress'の値が 'Complete'の行の更新をスキップしたいだけですか?もしそうなら、 'どこにProgress <> 'Complete'を追加してください。 – Blorgbeard

+0

Blorgbeard、あなたは正しいです、カーソルを使用する理由は、私がこのようなストアドプロシージャを新たに使用したためです。「SQLテーブルを反復して値を設定する方法」のほとんどの結果がカーソルを指しています。だから私はちょうどそれに立ち往生しましたが、あなたは有効なポイントを持っています。 – jakoh77

答えて

1

カーソルを維持したい場合は、スタートとして、これを考慮してください。

DECLARE @due_date DATE, @difference varchar(50), @id INT, @Now datetime = (Select GetDate()); 

DECLARE myCursor CURSOR FORWARD_ONLY FOR 
    SELECT [Engr Due], [Progress] 
    FROM dbo.Employee_Table OPEN myCursor 

FETCH NEXT FROM myCursor INTO @due_date, @Progress 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    if (@Progress != 'Completed') 
    BEGIN 
     SELECT @difference = DATEDIFF(day, @Now, @due_date) 
     UPDATE Employee_Table 
     SET [Remaining Days][email protected] 
     WHERE CURRENT OF myCursor 
    END 
    FETCH NEXT FROM myCursor INTO @due_date, @Progress 

END 

CLOSE myCursor DEALLOCATE myCursor 
+0

これはまさに私が必要としていたものでした!行方不明のものは@Progressの宣言だけでしたが、修正するのは簡単でした。私はあなたがそのようなカーソルに複数の値を書くことができることを学びました。私が知っていたはずのシンプルなものです。ありがとう、これは素晴らしいです。 – jakoh77

関連する問題