Skip to content

Instantly share code, notes, and snippets.

@rvegajr
Last active July 22, 2021 01:31
Show Gist options
  • Save rvegajr/89e1ba1b9d7a6cf8713322a8316d7b17 to your computer and use it in GitHub Desktop.
Save rvegajr/89e1ba1b9d7a6cf8713322a8316d7b17 to your computer and use it in GitHub Desktop.
Stored proc that will duplicate and execute code based on a time duration
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE OR ALTER PROCEDURE [dbo].[uspBatchCodeExecByHourCodeGen] ( @CodeTemplate VARCHAR(MAX), @MIN DATETIME=NULL, @MAX DATETIME=NULL, @TimeSpanHours INT=3, @DebugOnly BIT=0 )
AS
BEGIN
SET NOCOUNT ON;
/*
Example Call:
DECLARE @Start DATETIME2=DATEADD( DAY, -6, GETUTCDATE());
DECLARE @End DATETIME2=GETUTCDATE();
EXEC uspBatchCodeExecByHourCodeGen 'SET NOCOUNT ON;EXEC sp_executesql N''SELECT ''''%MIN%'''' AS MinDateValue, ''''%MAX%'''' AS MaxDateValue'';', @Start, @End, 1
DECLARE @Start DATETIME2=DATEADD( DAY, -6, GETUTCDATE());
DECLARE @End DATETIME2=GETUTCDATE();
EXEC uspBatchCodeExecByHourCodeGen 'SET NOCOUNT ON;DECLARE @S DATETIME2=CONVERT(DATETIME2, ''%MIN%''), @E DATETIME2=CONVERT(DATETIME2,''%MAX%'');EXEC [dbo].[uspResolveCemApiProjectIds] @S, @E;', @Start, @End, 3, 1
*/ --DECLARE @CodeTemplate VARCHAR(8000)='SET NOCOUNT ON;EXEC sp_executesql N''SELECT ''''%MIN%'''' AS MinDateValue, ''''%MAX%'''' AS MaxDateValue''; /* ITEM: min="%MIN%", max="%MAX%" */', @MIN DATETIME = NULL, @MAX DATETIME = null, @TimeSpanHours INT=6, @DebugOnly BIT=0;
DECLARE @NOTE VARCHAR(8000) = '';
SET @NOTE = 'Code Gen Batch By Hour Duration '; RAISERROR (@NOTE, 10, 1) WITH NOWAIT;
--This code will try to resolve missing project ids
IF (@MIN IS NULL) SET @MIN=DATEADD( DAY, -6, GETUTCDATE());
IF (@MAX IS NULL) SET @MAX=GETUTCDATE();
SET @NOTE = 'Setting Min to fix to ' + FORMAT(@MIN, 's') + ' Max to ' + FORMAT(@MAX, 's'); RAISERROR (@NOTE, 10, 1) WITH NOWAIT;
DROP TABLE IF EXISTS #T0; DROP TABLE IF EXISTS #T;
DECLARE @StartTimeCurrent DATETIME2; DECLARE @EndtimeCurrent DATETIME2; DECLARE @SQLCurrent NVARCHAR(2000); DECLARE @EndtimeCurrentLast DATETIME2; DECLARE @RecInBatch INT;
DECLARE @starttime DATETIME2; SET @starttime = @MIN;
DECLARE @Endtime DATETIME2; SET @Endtime = @MAX;
DECLARE @StartProcTime DATETIME; DECLARE @EndProcTime DATETIME;
DECLARE @TotalRecs INT=0; DECLARE @CurrentRec INT=0;
;with cte (starttime,endtime,endtimecurrent)
as
(
SELECT @starttime,@Endtime, @starttime AS RunningDateTime
UNION all
SELECT starttime,endtime, dateadd(HOUR,@TimeSpanHours,endtimecurrent) AS RunningDateTime from cte
WHERE endtimecurrent < endtime
)
SELECT * INTO #T0 FROM cte OPTION (maxrecursion 0);
SELECT dateadd(HOUR,@TimeSpanHours*-1,endtimecurrent) AS StartTime, endtimecurrent AS EndTime
, REPLACE(REPLACE(@CodeTemplate, '%MIN%', FORMAT(dateadd(HOUR,@TimeSpanHours*-1,endtimecurrent), 's')), '%MAX%', FORMAT(endtimecurrent, 's')) As CODEText
, ROW_NUMBER() OVER (ORDER BY endtimecurrent) RowNo
INTO #T
FROM #T0
WHERE dateadd(HOUR,@TimeSpanHours*-1,endtimecurrent)>=@MIN;
--SELECT * FROM #T;
DECLARE @SQLStatementsToExecute INT = 1; DECLARE @CurrSQLRow INT = 0; DECLARE @CurrSQLToExecute NVARCHAR(4000);
SELECT @SQLStatementsToExecute=COUNT(*) FROM #T;
IF (@DebugOnly=0) BEGIN
SET @NOTE = 'Executing '+CONVERT(VARCHAR(255), @SQLStatementsToExecute)+' statements.'; RAISERROR (@NOTE, 10, 1) WITH NOWAIT;
END ELSE BEGIN
SET @NOTE = 'Debugging flag is on, will only print statements'; RAISERROR (@NOTE, 10, 1) WITH NOWAIT;
END
WHILE @CurrSQLRow <= @SQLStatementsToExecute
BEGIN
SET @StartProcTime=GETUTCDATE();
SELECT @CurrSQLToExecute = CODEText FROM #T WHERE RowNo=@CurrSQLRow;
SET @NOTE = @CurrSQLToExecute; RAISERROR (@NOTE, 10, 1) WITH NOWAIT;
IF (@DebugOnly=0) EXECUTE sp_executesql @CurrSQLToExecute;
SET @EndProcTime=GETUTCDATE();
IF (@DebugOnly=0) BEGIN
SET @NOTE = '.....['+CONVERT(VARCHAR(255), @CurrSQLRow)+'/'+CONVERT(VARCHAR(255), @SQLStatementsToExecute)+'] Time Elapsed For the above SQL - '+CONVERT(VARCHAR(12),@EndProcTime-@StartProcTime, 114); RAISERROR (@NOTE, 10, 1) WITH NOWAIT;
END
SELECT @CurrSQLRow = @CurrSQLRow + 1
END
END
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment