SQL Server DBA Tools: List All Connections and Activities

Aug 30, 2024By Tung Dang
Tung Dang

Server Processes

Here's a straight forward query that every SQL Server DBA should have in their toolbox. This query lists all connections as well as blockings for a SQL Server.  It's very similar to the SQL Activity Monitor found in SSMS but more versatile and customizable.

--sp_who2

SELECT a1.SPID,
       [Database] = DB_NAME(a1.dbid),
       [User] = a1.loginame,
       Host = a1.hostname,
       a1.Status,
       OpenTransaction = a1.Open_Tran,
       Command = CASE WHEN a1.cmd = 'AWAITING COMMAND' THEN '' ELSE a1.cmd END,
       [Individual Query] = SUBSTRING(a2.[text], a4.statement_start_offset/2, (CASE WHEN a4.statement_end_offset = -1 THEN LEN(CONVERT(NVARCHAR(MAX), a2.[text])) * 2 ELSE a4.statement_end_offset END - a4.statement_start_offset)/2),
       CommandText = a2.[text],
       Application = a1.program_name,
       BlockedBy = CASE WHEN ISNULL(a4.blocking_session_id, 0) > 0 THEN a4.blocking_session_id END,
       Blocking = CASE WHEN a5.blocking_session_id IS NOT NULL THEN 'TRUE' ELSE 'FALSE' END,
       a5.BlockingCount,
       a1.WaitTime,
       WaitType = CASE WHEN a1.lastwaittype = 'MISCELLANEOUS' THEN '' ELSE a1.lastwaittype END,
       a1.WaitResource,
       a1.CPU,
       CPU_DELTA = ISNULL(a4.cpu_time, 0),
       a1.PHYSICAL_IO,
       a3.READS,
       a3.WRITES,
       a1.MEMUSAGE,
       a1.Login_Time,
       a1.Last_Batch
FROM sysprocesses a1
JOIN sys.dm_exec_sessions a3 ON a1.spid = a3.session_id
LEFT JOIN sys.dm_exec_requests a4 ON a3.session_id = a4.session_id
LEFT JOIN (
    SELECT blocking_session_id, BlockingCount = COUNT(1)
    FROM sys.dm_exec_requests
    WHERE blocking_session_id > 0
    GROUP BY blocking_session_id
) a5 ON a1.spid = a5.blocking_session_id
CROSS APPLY sys.dm_exec_sql_text(a1.sql_handle) a2
--WHERE command is not null
ORDER BY command DESC