Find a current blocking connection

SELECT t1.resource_type AS [lock type]
	,DB_NAME(resource_database_id) AS [database]
	,t1.resource_associated_entity_id AS [blk object]
	,t1.request_mode AS [lock req]	-- lock requested
	,t1.request_session_id AS [waiter sid]
	,t2.wait_duration_ms AS [wait time] -- spid of waiter  
	,	(
		SELECT [text]
		FROM sys.dm_exec_requests AS r WITH (NOLOCK) -- get sql for waiter
		CROSS APPLY sys.dm_exec_sql_text(r.[sql_handle])
		WHERE r.session_id = t1.request_session_id
		) AS [waiter_batch]
	,(
		SELECT SUBSTRING(qt.[text], r.statement_start_offset / 2, (
		CASE WHEN r.statement_end_offset = - 1 THEN LEN(CONVERT(NVARCHAR(max), qt.[text])) * 2 ELSE r.statement_end_offset 
		END - r.statement_start_offset) / 2)
		FROM sys.dm_exec_requests AS r WITH (NOLOCK)
		CROSS APPLY sys.dm_exec_sql_text(r.[sql_handle]) AS qt
		WHERE r.session_id = t1.request_session_id
		) AS [waiter_stmt]-- statement blocked
	,	t2.blocking_session_id AS [blocker sid] -- spid of blocker
	,	(
		SELECT [text]
		FROM sys.sysprocesses AS p -- get sql for blocker
		CROSS APPLY sys.dm_exec_sql_text(p.[sql_handle])
		WHERE p.spid = t2.blocking_session_id
		) AS [blocker_batch]
FROM sys.dm_tran_locks AS t1 WITH (NOLOCK)
INNER JOIN sys.dm_os_waiting_tasks AS t2 WITH (NOLOCK) ON t1.lock_owner_address = t2.resource_address
OPTION (RECOMPILE);

dm_tran_locks

dm_os_waiting_tasks

dm_exec_requests

sys.sysprocesses

Spread the love