Monday, 15 December 2025

SQLDBA-Longer TempDB OpenTran

 

Get alert long open transaction on Temp DB.

USE [msdb]

GO


/****** Object:  Job [ADM - Longer TempDB OpenTran]    Script Date: 12/15/2025 10:17:01 AM ******/

BEGIN TRANSACTION

DECLARE @ReturnCode INT

SELECT @ReturnCode = 0

/****** Object:  JobCategory [[On Demand]]    Script Date: 12/15/2025 10:17:01 AM ******/

IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[On Demand]' AND category_class=1)

BEGIN

EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[On Demand]'

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback


END


DECLARE @jobId BINARY(16)

EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N'DBA - Longer TempDB OpenTran', 

@enabled=1, 

@notify_level_eventlog=0, 

@notify_level_email=2, 

@notify_level_netsend=0, 

@notify_level_page=0, 

@delete_level=0, 

@description=N'No description available.', 

@category_name=N'[On Demand]', 

@owner_login_name=N'sa', 

@notify_email_operator_name=N'', @job_id = @jobId OUTPUT

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

/****** Object:  Step [Longer TempDB OpenTran]    Script Date: 12/15/2025 10:17:01 AM ******/

EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Longer TempDB OpenTran', 

@step_id=1, 

@cmdexec_success_code=0, 

@on_success_action=1, 

@on_success_step_id=0, 

@on_fail_action=2, 

@on_fail_step_id=0, 

@retry_attempts=0, 

@retry_interval=0, 

@os_run_priority=0, @subsystem=N'TSQL', 

@command=N'-- Create table in DBA database - one time.

--CREATE TABLE dbo.OpenTranStatus (  

--   ActiveTransaction VARCHAR(25),  

--   Details sql_variant   

--   );  



USE tempdb

GO

DECLARE @DATE DATETIME 

SET @DATE  = GETDATE()

DECLARE @xml1 NVARCHAR(MAX)

DECLARE @body NVARCHAR(MAX)

DECLARE @emailattachment VARCHAR(200);  

DECLARE @sp_id VARCHAR(10)


-- Execute the command, putting the results in the table.  

TRUNCATE TABLE master.dbo.OpenTranStatus


INSERT INTO master.dbo.OpenTranStatus   

EXEC (''DBCC OPENTRAN WITH TABLERESULTS, NO_INFOMSGS'');  

  

IF EXISTS ( SELECT 1 FROM master.dbo.OpenTranStatus WHERE ActiveTransaction = ''OLDACT_STARTTIME'' AND DATEDIFF(MI, CAST(Details AS DATETIME), @DATE)  >= 5 )

BEGIN

SET @xml1 = 

''<html><body><H4>Longer TempDB OpenTran</H4>

<table border = 1> 

<tr>

<th> ActiveTransaction </th> <th> Details </th></tr>'' +

CAST((SELECT [ActiveTransaction] AS ''td'', 

'''', 

[Details] AS ''td''

FROM master.dbo.OpenTranStatus

FOR XML PATH(''tr''), ELEMENTS) AS NVARCHAR(MAX)) + 

N''</table>'';

SET @body = @xml1 + ''</body></html>''

SELECT TOP 1 @sp_id = CAST(Details AS VARCHAR(100) ) FROM master.dbo.OpenTranStatus WHERE ActiveTransaction = ''OLDACT_SPID''


SET @emailattachment = ''exec master.dbo.sp_chi_who '' + @sp_id


EXEC msdb.dbo.sp_send_dbmail

@subject = ''Longer TempDB OpenTran Report'',

@body = @body,

@body_format =''HTML'',

@recipients = ''ksubbareddy.sap@gmail.com'',

@query =  @emailattachment,  

@query_result_width = 1500,  

@attach_query_result_as_file = 1,  

@query_attachment_filename = ''TempDBOpenTran.txt'';


END

', 

@database_name=N'master', 

@flags=0

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'Evry 5 mins', 

@enabled=1, 

@freq_type=4, 

@freq_interval=1, 

@freq_subday_type=4, 

@freq_subday_interval=5, 

@freq_relative_interval=0, 

@freq_recurrence_factor=0, 

@active_start_date=20220929, 

@active_end_date=99991231, 

@active_start_time=60000, 

@active_end_time=210000, 

@schedule_uid=NULL

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

COMMIT TRANSACTION

GOTO EndSave

QuitWithRollback:

    IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION

EndSave:

GO



No comments:

Post a Comment

SQLDBA - Get Space Used by Tables and Indexes in SQL Server

 Get Space Used by Tables and Indexes in SQL Server Databases can consume significant amounts of storage, so it’s important to understand ho...