协助在tSQL中制作游标

时间:2017-06-12 23:19:26

标签: sql-server sql-server-2008 tsql

我确信这是一种更优雅(或简单"正确")的方式来做我想要实现的目标。我相信我需要使用光标,但不能完全围绕如何使用。

我有下面的代码来查找合同中剩下的日子,但除非我把“'在哪里'子句(基本上选择一个特定的记录),我得到这个错误信息:

  

'子查询返回的值超过1'

这就是为什么我认为我需要一个光标;循环记录,并用合同中剩余的天数更新字段。

这就是我拥有的东西,它可以返回一个数字。

DECLARE @TodaysDT date = GetDate()

DECLARE @ContractExpirationDT date =                                
    (SELECT ExprDt from CONTRACTS                                   
    WHERE ID = 274);                                                

DECLARE @DaysRemaining INT = 
(SELECT DATEDIFF(dd, @ContractExpirationDT,@TodaysDT));             

 Print @DaysRemaining;      

这将返回特定记录ID的正确值(本例中为ID 274)

如何使用游标逐步浏览每条记录,然后使用@DaysRemaining值更新每条记录中的字段?

感谢您的时间!

1 个答案:

答案 0 :(得分:0)

在我看来,你不需要光标;您可以只运行没有where子句的更新,以计算所有行的剩余天数。

以下是一个可以作为起点的基本示例:

--Create a table variable to hold test data
declare @contract table (Id int, ExprDt datetime, DaysRemaining int )

--Insert sample data
insert into @contract select 1, '20200101'  ,null
insert into @contract select 2, '20201231'  ,null
insert into @contract select 3, '20191231'  ,null
insert into @contract select 274, '20191231',null

--Save today's date inseide a variable
DECLARE @TodaysDT date = GetDate()

--Update DaysRemaining field for each record
update @contract set DaysRemaining = DATEDIFF(dd, ExprDt,@TodaysDT)

--Select records to check results
select Id, ExprDt, DaysRemaining
from @contract

以下是此命令的输出:

enter image description here