Health Check 07: activity and blocking

What is running right now and who is blocking whom. If sp_WhoIsActive is installed it uses that for more detail. Part of my SQL Server health check: run Health Check 00 for a one-page summary, then the numbered scripts for the detail behind each area. Read-only, changes nothing. Tested on SQL Server 2017 and 2025.

-- 07_Activity_and_Blocking.sql - what is running now and who is blocking whom. Read-only.
-- If sp_WhoIsActive is installed it is used (EXEC sp_WhoIsActive @find_block_leaders = 1 gives more detail).
SET NOCOUNT ON;
SELECT r.session_id, r.blocking_session_id AS blocked_by, s.login_name, s.host_name, s.program_name, DB_NAME(r.database_id) AS [database],
       r.status, r.command, r.wait_type, r.wait_time / 1000 AS wait_seconds, r.total_elapsed_time / 1000 AS running_seconds,
       r.cpu_time, r.logical_reads, r.percent_complete,
       SUBSTRING(t.text, r.statement_start_offset / 2 + 1,
                 (CASE WHEN r.statement_end_offset = -1 THEN DATALENGTH(t.text) ELSE r.statement_end_offset END - r.statement_start_offset) / 2 + 1) AS statement
FROM sys.dm_exec_requests AS r JOIN sys.dm_exec_sessions AS s ON s.session_id = r.session_id
OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) AS t
WHERE s.is_user_process = 1 AND r.session_id <> @@SPID
ORDER BY r.blocking_session_id DESC, r.total_elapsed_time DESC;

-- head blockers: blocking others but not blocked themselves (often a sleeping session with an open transaction)
SELECT s.session_id AS head_blocker, s.login_name, s.host_name, s.program_name, s.status, s.open_transaction_count,
       s.last_request_end_time, ib.event_info AS last_statement
FROM sys.dm_exec_sessions AS s
CROSS APPLY sys.dm_exec_input_buffer(s.session_id, NULL) AS ib
WHERE s.session_id IN (SELECT blocking_session_id FROM sys.dm_exec_requests WHERE blocking_session_id <> 0)
  AND s.session_id NOT IN (SELECT session_id FROM sys.dm_exec_requests WHERE blocking_session_id <> 0);

IF OBJECT_ID(N'master.dbo.sp_WhoIsActive') IS NOT NULL
    EXEC master.dbo.sp_WhoIsActive @find_block_leaders = 1, @sort_order = '[blocked_session_count] DESC';