Last active
July 22, 2021 01:31
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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