如何在SQL语句中的Open Cursor内部执行条件语句

时间:2016-05-11 21:33:00

标签: sql sql-server if-statement stored-procedures conditional

我的SQL服务器上有一个存储过程,每晚运行一次。目的是计算两个日期之间的差异,并将余数放入一列。

我有以下字段:截止日期,今天的日期,进度和剩余天数。我计算今天的日期和截止日期之间的差异,并将差异存储在剩余天数列中。

但现在我想检查Progress列的值,如果Progress是'Complete',那么我想跳过剩余的更新日期。

这样,如果工作完成,剩余的天数将不会继续倒计时,因为差异远离今天的日期。

这是我到目前为止所拥有的。这适用于除进度列上的条件检查之外的所有内容。我不知道如何在我正在使用的光标内执行此操作。

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]=@difference 
        WHERE CURRENT OF myCursor 
    FETCH NEXT FROM myCursor INTO @due_date 
END

CLOSE myCursor 
DEALLOCATE myCursor

1 个答案:

答案 0 :(得分: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]=@difference 
        WHERE CURRENT OF myCursor 
    END
    FETCH NEXT FROM myCursor INTO @due_date, @Progress

END

CLOSE myCursor DEALLOCATE myCursor