2017-06-12 15 views
0

私が達成しようとしていることを行うよりエレガントな(または単に「正しい」)方法があると確信しています。私はカーソルを使用する必要があると信じていますが、どうやって頭を包み込むことはできません。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値?

ありがとうございました!

答えて

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

関連する問題