sp_who (Transact-SQL)
提供有关 Microsoft SQL Server 数据库引擎实例中的当前用户、会话和进程的信息。可以筛选信息以便只返回那些属于特定用户或特定会话的非空闲进程。
语法
sp_who [ [ @loginame = ] 'login' | session ID | 'ACTIVE' ]
参数
[ @loginame = ] 'login' | session ID | 'ACTIVE'
用于筛选结果集。login 的数据类型为 sysname,它用于标识属于特定登录名的进程。
session ID(在 SQL Server 2000 和更早版本中为 SPID)是属于 SQL Server 实例的会话标识号。session ID 的数据类型为 smallint。
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。否则该列为零。 当与指定会话 ID 相关联的事务受到孤立分布式事务的阻塞时,该列将对阻塞孤立事务返回“-2”。 |
dbname |
nchar(128) |
进程使用的数据库。 |
cmd |
nchar(16) |
为该进程执行的数据库引擎命令(Transact-SQL 语句、数据库引擎进程等等)。 |
request_id |
int |
特定会话中运行的请求的 ID。 |
如果是并行处理,则会为特定的会话 ID 创建子线程。主线程则以 spid = <xxx> 和 ecid =0 表示。其他子线程具有相同的 spid = <xxx>,但 ecid > 0。
注释
阻塞进程(可能含有排他锁)是控制其他进程所需要的资源的进程。
在 SQL Server 2000 和更高版本中,所有孤立分布式事务的会话 ID 都被赋予值“-2”。孤立分布式事务是不与任何会话 ID 关联的分布式事务。有关详细信息,请参阅使用标记的事务(完整恢复模式)。
SQL Server 2000 和更高版本保留从 1 到 50 的会话 ID 值以供内部使用,而 51 或更大的会话 ID 值则表示用户会话。
权限
要求对服务器具有 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