【问题标题】:How to do conditional statement inside of a Open Cursor in a SQL statement如何在 SQL 语句中的打开游标内执行条件语句
【发布时间】:2016-09-07 12:07:08
【问题描述】:

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

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

但现在我想检查 Progress 列的值,如果 Progress 为“完成”,那么我想跳过剩余天数的更新。

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

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

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

【问题讨论】:

  • 你为什么要使用光标?这整个东西看起来可以用update Employee_Table set [Remaining Days] = DATEDIFF(day, GETDATE(), [Engr Due])代替。
  • 至于Progress 的事情,您是否只想跳过更新Progress 值为Complete 的行?如果是这样,只需在上面添加where Progress <> 'Complete'
  • Blorgbeard,你是对的,我选择使用游标的原因是因为我是这样的存储过程的新手,所以在我尝试谷歌“如何遍历 sql 表并设置值” " 大多数结果都指向一个光标。所以我只是坚持下去,但你有一个有效的观点。
  • 好的,但出于性能原因,您应该避免使用游标。如果您正在处理大量记录,您可能希望将其转换回基于集合的查询。一般来说,遍历表是 SQL 的错误方法。它旨在对数据集进行操作 - 您将迭代的实际机制留给 SQL 引擎。
  • 请注意,没有理由不能在存储过程中放置​​一个简单的update 语句。事实上它是一个 sproc 并没有真正改变任何东西。

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


【解决方案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

【讨论】:

  • 这正是我所需要的!唯一缺少的是@Progress 的声明,但这很容易解决。我了解到您可以像这样将多个值写入光标。看起来很简单,我应该知道的。谢谢,太好了。
猜你喜欢
  • 1970-01-01
  • 2015-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多