USP_DATALIST_BUSINESSPROCESSES_SCHEDULEDTORUN

Returns business processes that are schedules to be run now.

Parameters

Parameter Parameter Type Mode Description
@LOCKSELECTEDSCHEDULES bit IN Lock Selected Schedules
@DBREVKEY nvarchar(500) IN

Definition

Copy


CREATE procedure [dbo].[USP_DATALIST_BUSINESSPROCESSES_SCHEDULEDTORUN]
(
    @LOCKSELECTEDSCHEDULES bit = 0,
    @DBREVKEY nvarchar(500) = null
)
as
begin
  set nocount on;

  declare @UPGRADEINPROGESS bit = 0;
  select @UPGRADEINPROGESS = 1 From sys.extended_properties where name = 'bb_DisableScheduledProcesses' and class_desc = 'DATABASE' and value = 'true';

  if @DBREVKEY is not null
  begin
    declare @CURRENTREVKEY nvarchar(500)= dbo.UFN_SCHEMA_DB_GETDBREVKEY();
    if @DBREVKEY <> @CURRENTREVKEY
        raiserror('BBERR_DBREVKEYDOESNOTMATCH', 13, 1);
  end

  if @UPGRADEINPROGESS = 0
  begin

      --Create a lock to prevent simultaneous runs

      declare @LOCKRESULT int;
      exec @LOCKRESULT = sp_getapplock 'C6FCAB60-2339-4162-9B12-CBEA63D71CBB', 'Exclusive', 'Session', 0;

      if @LOCKRESULT >= 0
      begin

        --Define constants

        declare @LOOKAHEADPARAMETERDEFINITION nvarchar(max) = N'@PARAMETERSETID uniqueidentifier, @RESULT bit out';  

        --Gather time data

        declare @NOW datetime = GETDATE();
        declare @TODAY date = @NOW;

        --Define table for schedules that are ready to be run

        declare @READYSCHEDULES table (BUSINESSPROCESSID uniqueidentifier, SCHEDULEID uniqueidentifier, BUSINESSPROCESSPARAMETERSETID uniqueidentifier, LOOKAHEADFUNCTIONNAME nvarchar(max));

        --Select schedules that are ready to be run

        with XMLNAMESPACES('bb_appfx_businessprocess' as bp, 'bb_appfx_globalchange' as gc)
        insert into @READYSCHEDULES
        select  BPS.BUSINESSPROCESSID, 
                S.ID, 
                BPS.BUSINESSPROCESSPARAMETERSETID, 
                ISNULL(GCC.GLOBALCHANGESPECXML.value('(/gc:GlobalChangeSpec/@LookaheadFunctionName)[1]', 'nvarchar(max)'),BPC.BUSINESSPROCESSSPECXML.value('(/bp:BusinessProcessSpec/@LookaheadFunctionName)[1]', 'nvarchar(max)')) as LOOKAHEADFUNCTIONNAME
        from dbo.BUSINESSPROCESSSCHEDULE BPS
        inner join dbo.BUSINESSPROCESSCATALOG BPC on BPC.ID = BPS.BUSINESSPROCESSID
        inner join dbo.SCHEDULE S on S.ID = BPS.SCHEDULEID
        left join dbo.GLOBALCHANGE GC on BPC.ID = '3269A1D1-31CB-4D28-945C-B7623A3EFCCA' AND GC.ID = BPS.BUSINESSPROCESSPARAMETERSETID
        left join dbo.GLOBALCHANGECATALOG GCC on GCC.ID = GC.GLOBALCHANGECATALOGID
        where S.ENABLED = 1
        and (S.ENDDATE >= @TODAY or S.ENDDATE is null)
        and S.STARTDATE <= @TODAY
        and dbo.UFN_SCHEDULE_ISTIMETORUNSCHEDULE(@NOW, S.TYPECODE, S.FREQUENCY, S.SUBDAYFREQUENCYTYPECODE, S.TIME, S.SUBDAYFREQUENCY, S.SUBDAYSTARTINGTIME, S.SUBDAYENDINGTIME, S.DAYSOFWEEK, S.DAYOFMONTH, S.WEEKCODE, S.DAYOFWEEKCODE, S.MONTHCODE, S.STARTDATE, S.ENDDATE, S.LASTRUNTIME) = 1
        and APPLOCK_TEST('public',upper(cast(S.ID as nvarchar(36))),'Exclusive','Session') = 1;


        --Loop through selected schedules and create locks

        declare @SCHEDULEID uniqueidentifier, @BUSINESSPROCESSID uniqueidentifier, @BUSINESSPROCESSPARAMETERSETID uniqueidentifier, @LOOKAHEADFUNCTIONNAME nvarchar(max);
        declare SCHEDULECURSOR cursor local FAST_FORWARD for
        select BUSINESSPROCESSID, SCHEDULEID, BUSINESSPROCESSPARAMETERSETID, LOOKAHEADFUNCTIONNAME from @READYSCHEDULES;

        open SCHEDULECURSOR;
        fetch next from SCHEDULECURSOR into @BUSINESSPROCESSID, @SCHEDULEID, @BUSINESSPROCESSPARAMETERSETID, @LOOKAHEADFUNCTIONNAME
        declare @SELECTEDSCHEDULES table (BUSINESSPROCESSID uniqueidentifier, SCHEDULEID uniqueidentifier, BUSINESSPROCESSPARAMETERSETID uniqueidentifier);
        while @@FETCH_STATUS = 0
        begin

            declare @LOOKAHEADRESULT bit = 0;
            if @LOOKAHEADFUNCTIONNAME is not null
            begin
                declare @LOOKAHEADSTATEMENT nvarchar(max) = 'select @RESULT=dbo.[' + @LOOKAHEADFUNCTIONNAME + '](@PARAMETERSETID);';
                exec sp_executesql @LOOKAHEADSTATEMENT, @LOOKAHEADPARAMETERDEFINITION, @PARAMETERSETID=@BUSINESSPROCESSPARAMETERSETID, @RESULT=@LOOKAHEADRESULT out;
            end
            else
                set @LOOKAHEADRESULT = 1;

            if @LOOKAHEADRESULT = 1
            begin
                -- The lookahead returned true so lock the schedule

                -- and add it to the selected list.

                declare @SCHEDULELOCKRESULT int;
                if @LOCKSELECTEDSCHEDULES = 1
                begin
                    declare @N nvarchar(36) = upper(cast(@SCHEDULEID as nvarchar(36)));
                    exec @SCHEDULELOCKRESULT = sp_getapplock @N, 'Exclusive', 'Session', 0;
                end

                if (@LOCKSELECTEDSCHEDULES = 0) or (@SCHEDULELOCKRESULT >= 0
                    insert into @SELECTEDSCHEDULES values(@BUSINESSPROCESSID, @SCHEDULEID, @BUSINESSPROCESSPARAMETERSETID);
            end
            else
            begin
                -- The lookahead returned false so update the last run time to now and skip it.

                update dbo.SCHEDULE
                set LASTRUNTIME = @NOW
                from dbo.SCHEDULE S
                where S.ID = @SCHEDULEID;
            end

            fetch next from SCHEDULECURSOR into @BUSINESSPROCESSID, @SCHEDULEID, @BUSINESSPROCESSPARAMETERSETID, @LOOKAHEADFUNCTIONNAME;
        end

        close SCHEDULECURSOR;
        deallocate SCHEDULECURSOR;


        --Update last run date for selected schedules

        update dbo.SCHEDULE
        set LASTRUNTIME = @NOW
        from dbo.SCHEDULE S
        inner join @SELECTEDSCHEDULES SEL on SEL.SCHEDULEID = S.ID;


        --Select out selected schedules

        select BUSINESSPROCESSID, SCHEDULEID, BUSINESSPROCESSPARAMETERSETID
        from @SELECTEDSCHEDULES;

        exec dbo.USP_BUSINESSPROCESSSCHEDULELASTRUN_UPDATE;

        --Release app lock

        exec @LOCKRESULT = sp_releaseapplock 'C6FCAB60-2339-4162-9B12-CBEA63D71CBB', 'Session';
      end

  end

end