sp_who (Transact-SQL)
适用范围:SQL Server
提供有关 SQL Server 数据库引擎实例中的当前用户、会话和进程的信息。 可以筛选信息,以仅返回那些未空闲、属于特定用户或属于特定会话的进程。
语法
sp_who [ [ @loginame = ] { 'login' | *session_id* | 'ACTIVE' } ]
[ ; ]
参数
[ @loginame = ] { 'login' | session_id |“ACTIVE” }
用于筛选结果集。
login 是 标识属于特定登录名的进程的 sysname 。
session_id 是属于 SQL Server 实例的会话标识号。 session_id较小。
ACTIVE
排除正在等待用户下一个命令的会话。
如果没有提供任何值,则过程报告属于实例的所有会话。
返回代码值
0
(成功)或 1
(失败)。
结果集
sp_who
返回一个结果集,其中包含以下信息。
列 | 数据类型 | 描述 |
---|---|---|
spid |
smallint | 会话 ID。 |
ecid |
smallint | 与特定会话 ID 相关联的给定线程的执行上下文 ID。 ECID = { 0, 1, 2, 3, ...n },其中 0 始终表示主线程或父线程,{ 1、2、3...n } 表示子线程。 |
status |
nchar(30) | 进程状态。 可能的值为: - dormant 。 SQL Server 正在重置会话。- running 。 会话正在运行一个或多个批。 多个活动的结果集 (MARS) 启用后,会话可以运行多个批。 有关详细信息,请参阅使用多重活动结果集 (MARS)。- background 。 会话正在运行一个后台任务,例如死锁检测。- rollback 。 会话具有正在处理的事务回滚。- pending 。 会话正在等待工作线程变为可用。- runnable 。 会话的任务在等待获取时间量程时位于计划程序的可运行队列中。- spinloop 。 会话的任务正在等待调节锁变为可用。- suspended 。 会话正在等待事件(如 I/O)完成。 |
loginame |
nchar(128) | 与特定进程相关联的登录名。 |
hostname |
nchar(128) | 每个进程的主机或计算机名。 |
blk |
char(5) | 如果存在阻塞进程,则是该阻塞进程的会话 ID。 否则,此列为 0 .当与指定会话 ID 关联的事务被孤立的分布式事务阻止时,此列将返回阻塞孤立事务的一个 -2 。 |
dbname |
nchar(128) | 进程使用的数据库。 |
cmd |
nchar(16) | 数据库引擎命令(Transact-SQL 语句、内部数据库引擎进程等)为进程执行。 在 SQL Server 2019(15.x)及更高版本中,数据类型为 nchar(26)。 |
request_id |
int | 特定会话中运行的请求的 ID。 |
通过并行处理,将为特定会话 ID 创建子线程。 主线程则以 spid = <xxx>
和 ecid = 0
表示。 其他子线程具有相同 spid = <xxx>
的,但具有 ecid > 0
。
注解
阻塞进程(可能具有独占锁)是一个包含另一个进程所需的资源。
为所有孤立的分布式事务分配会话 ID 值 -2
。 孤立分布式事务是未与任何会话 ID 关联的分布式事务。 有关详细信息,请参阅 使用标记的事务以一致的方式恢复相关数据库。
is_user_process
查询将系统进程与用户进程分开的列sys.dm_exec_sessions
。
权限
要求服务器上的 VIEW SERVER STATE 权限才能在 SQL Server 实例上查看所有正在执行的会话。 否则,用户只能查看当前会话。
示例
A. 列出所有当前进程
以下示例使用没有参数的 sp_who
来报告所有当前用户。
USE master;
GO
EXEC sp_who;
GO
B. 列出特定用户的进程
以下示例显示如何通过登录名查看有关单个当前用户的信息。
USE master;
GO
EXEC sp_who 'janetl';
GO
°C 显示所有活动进程
USE master;
GO
EXEC sp_who 'active';
GO
D. 显示会话 ID 标识的特定进程
USE master;
GO
EXEC sp_who '10' --specifies the process_id;
GO