2017-06-12 72 views
0

我確定有一個更優雅的(或者簡單地說是「正確的」)方法來完成我想要實現的目標。我相信我需要使用光標,但不能完全包圍我的頭如何。幫助在tSQL中創建遊標

我有下面的代碼找到留在合同的日子,但除非我把「其中」條款(這基本上是選擇一個特定的記錄),我收到此錯誤信息:

「子查詢返回多個值'

這就是爲什麼我認爲我需要一個遊標;循環查看記錄,並更新合同中剩餘天數的字段。

這是我所擁有的,它在儘可能多地返回一個數字。

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

在我看來,你不需要遊標;您可以運行更新而不使用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, '202' ,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