我确信这是一种更优雅(或简单"正确")的方式来做我想要实现的目标。我相信我需要使用光标,但不能完全围绕如何使用。
我有下面的代码来查找合同中剩下的日子,但除非我把“'在哪里'子句(基本上选择一个特定的记录),我得到这个错误信息:
'子查询返回的值超过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
值更新每条记录中的字段?
感谢您的时间!
答案 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
以下是此命令的输出: