【发布时间】: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