USP_CONSTITUENT_GETCONSECUTIVEYEARSFROMGIVENSET
Returns consecutive years based on input table.
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@SETSQL | nvarchar(max) | IN | |
@THISYEAR | datetime | IN | |
@LASTYEAR | datetime | IN | |
@CONSECUTIVEYEARS | int | INOUT | |
@GIVENSINCEFISCALYEAR | datetime | INOUT |
Definition
Copy
CREATE procedure dbo.USP_CONSTITUENT_GETCONSECUTIVEYEARSFROMGIVENSET(
@SETSQL nvarchar(max),
@THISYEAR datetime,
@LASTYEAR datetime,
@CONSECUTIVEYEARS int = null output,
@GIVENSINCEFISCALYEAR datetime = null output
)
as
begin
set nocount on
--This is a fairly long calculation that should not be duplicated however it requires you know the list of revenue
--Using SP_EXECUTESQL here to allow consolidation of code but allow for any table to be used. ID column must be a REVENUESPLITID
declare @SQL nvarchar(max);
set @SQL = replace('
declare @CURRENTDATE datetime;
declare @FISCALYEAR_FIRSTDAY datetime;
declare @PREVIOUSFISCALYEAR_FIRSTDAY datetime;
declare @CONTINUE bit;
set @CURRENTDATE = getdate();
declare FISCALYEARCURSOR cursor local fast_forward for
<SETSQL>
set @CONSECUTIVEYEARS = 0;
set @GIVENSINCEFISCALYEAR = null;
open FISCALYEARCURSOR;
fetch next from FISCALYEARCURSOR into @FISCALYEAR_FIRSTDAY;
if @@FETCH_STATUS = 0 begin
if @FISCALYEAR_FIRSTDAY > @THISYEAR begin
set @CONTINUE = 1;
fetch next from FISCALYEARCURSOR into @PREVIOUSFISCALYEAR_FIRSTDAY;
end
else if @FISCALYEAR_FIRSTDAY = @THISYEAR or
@FISCALYEAR_FIRSTDAY = @LASTYEAR begin
set @CONSECUTIVEYEARS = @CONSECUTIVEYEARS + 1;
set @CONTINUE = 1;
fetch next from FISCALYEARCURSOR into @PREVIOUSFISCALYEAR_FIRSTDAY;
end
else
set @CONTINUE = 0;
end
while @@FETCH_STATUS = 0 and @CONTINUE = 1 begin
if @CONSECUTIVEYEARS = 0 begin
if @PREVIOUSFISCALYEAR_FIRSTDAY > @THISYEAR begin
set @FISCALYEAR_FIRSTDAY = @PREVIOUSFISCALYEAR_FIRSTDAY;
fetch next from FISCALYEARCURSOR into @PREVIOUSFISCALYEAR_FIRSTDAY;
end
else if @PREVIOUSFISCALYEAR_FIRSTDAY = @THISYEAR or
@PREVIOUSFISCALYEAR_FIRSTDAY = @LASTYEAR begin
set @CONSECUTIVEYEARS = @CONSECUTIVEYEARS + 1;
set @FISCALYEAR_FIRSTDAY = @PREVIOUSFISCALYEAR_FIRSTDAY;
fetch next from FISCALYEARCURSOR into @PREVIOUSFISCALYEAR_FIRSTDAY;
end
else
set @CONTINUE = 0
end
else if @PREVIOUSFISCALYEAR_FIRSTDAY = dateadd(year, -1, @FISCALYEAR_FIRSTDAY) begin
set @CONSECUTIVEYEARS = @CONSECUTIVEYEARS + 1;
set @FISCALYEAR_FIRSTDAY = @PREVIOUSFISCALYEAR_FIRSTDAY;
fetch next from FISCALYEARCURSOR into @PREVIOUSFISCALYEAR_FIRSTDAY;
end
else
set @CONTINUE = 0;
end
--When a cursor is used, it should be explicitly closed/deallocated in case of blocking or USP running long
close FISCALYEARCURSOR;
deallocate FISCALYEARCURSOR;
if @CONSECUTIVEYEARS > 0
set @GIVENSINCEFISCALYEAR = @FISCALYEAR_FIRSTDAY;
', '<SETSQL>', @SETSQL);
exec sp_executesql @SQL, N'@CONSECUTIVEYEARS int = null output,@GIVENSINCEFISCALYEAR datetime = null output, @THISYEAR datetime = null, @LASTYEAR datetime = null',
@CONSECUTIVEYEARS = @CONSECUTIVEYEARS output,@GIVENSINCEFISCALYEAR = @GIVENSINCEFISCALYEAR output, @THISYEAR = @THISYEAR, @LASTYEAR = @LASTYEAR;
end