sp_who3: sp_who2 with SQL Text, Waits and Reads

sp_who3 works like sp_who2 but adds the running SQL text, wait type, reads, writes and elapsed time, using the sys.dm_exec_sessions and sys.dm_exec_requests DMVs. It only lists sessions that are running a request. For much more detail use Adam Machanic’s sp_WhoIsActive. Tested on SQL Server 2017 and 2025 and safe to run more than once.

USE [master];
GO

/****** Object:  StoredProcedure [dbo].[sp_who3]    Script Date: 24/06/2016 15:29:28 ******/

SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
CREATE OR ALTER PROCEDURE [dbo].[sp_who3]
AS
--------------------------------------------------------------------------------------------------------
-- mimics sp_who2 with query text
-- SPID , Status ,  Login , HostName , BlkBy , DBName , Command , CPUTime , DiskIO , LastBatch , ProgramName , SPID , REQUESTID
--------------------------------------------------------------------------------------------------------
-- DATE			MODIFIED BY		DESCRIPTION

--------------------------------------------------------------------------------------------------------

     SET NOCOUNT ON;
     SELECT CONVERT(CHAR(5), es.session_id) AS SPID,
            er.status AS Status,
            es.login_name AS Login,
            es.host_name AS HostName,
            CONVERT(CHAR(5), isnull(blocking_session_id, '')) AS BlkBy,
            DB_NAME(er.database_id) AS [database],
            command,
            CONVERT(VARCHAR, er.cpu_time) AS CPUTime,
            CONVERT(VARCHAR, er.total_elapsed_time) AS ElapsedTime,
            CONVERT(VARCHAR, er.reads) AS Reads,
            CONVERT(VARCHAR, er.writes) AS Writes,
            er.start_time AS StartTime,
            isnull(wait_type, '') AS WaitType,
            CONVERT(CHAR(5), wait_time) AS WaitTime,
            es.program_name AS Program,
            es.client_interface_name AS Provider,
            isnull(st.text, '') AS SQLText,
            CONVERT(CHAR(5), request_id) AS RequestID
     FROM sys.dm_exec_sessions es
          JOIN sys.dm_exec_requests er ON er.session_id = es.session_id
          OUTER APPLY sys.dm_exec_sql_text(sql_handle) st;
GO