2017-06-12 5 views
0

Ich bin mir sicher, dass es eine elegantere (oder einfach "korrekte") Möglichkeit gibt, das zu tun, was ich erreichen möchte. Ich glaube, ich muss einen Cursor verwenden, aber ich kann meinen Kopf nicht so richtig einwickeln.Unterstützung, die einen Cursor in tSQL macht

Ich habe den Code unten an die Tage nach links in einen Vertrag zu finden, aber wenn ich die ‚Wo‘ -Klausel setzen (die im Grunde einen bestimmten Datensatz auswählt), erhalte ich diese Fehlermeldung:

‚Subquery mehr als 1 Wert '

Deshalb denke ich, ich brauche einen Cursor; Durchlaufen der Datensätze und Aktualisieren eines Felds mit der Anzahl der verbleibenden Tage in einem Vertrag.

Hier ist, was ich habe, was in-so viel funktioniert, dass es eine Zahl zurückgibt.

DECLARE @TodaysDT date = GetDate() 

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

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

Print @DaysRemaining;  

Dies gibt einen richtigen Wert für eine bestimmte Datensatz-ID (diesen Fall, ID 274)

Wie kann ich einen Cursor verwenden, um durch jeden Datensatz zu dem Schritt, und dann ein Feld mit dem in jedem Datensatz aktualisieren @DaysRemaining Wert?

Vielen Dank für Ihre Zeit!

Antwort

0

Meiner Meinung nach brauchen Sie keinen Cursor; Sie können einfach ein Update ohne where Klausel ausführen, um die verbleibenden Tage für alle Zeilen zu berechnen. Hier

ist ein einfaches Beispiel, das Sie als Ausgangspunkt verwenden können:

--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 

Hier ist die Ausgabe dieses Befehls:

enter image description here