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