您的位置:首页 > 数据库

[SQL Server] sp_who, sp_who2和sp_who3

2012-08-24 10:43 423 查看
[SQL Server] sp_who, sp_who2和sp_who3

sp_who可以返回如下信息: (可选参数LoginName, 或active代表活动会话数)

Spid (系统进程ID)

status (进程状态)

loginame (用户登录名)

hostname(用户主机名)

blk (阻塞进程的SPID)

dbname (进程正在使用的数据库名)

Cmd (当前正在执行的命令类型)

Transact-SQL 语法约定

语法

sp_who [ [ @loginame = ] 'login' | session ID | 'ACTIVE' ]


参数

[ @loginame = ] 'login' |
session ID | 'ACTIVE'
用于筛选结果集。

login 的数据类型为
sysname,它用于标识属于特定登录名的进程。

session ID 是属于 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。

注释

阻塞进程(可能含有排他锁)是控制其他进程所需要的资源的进程。

所有孤立的分布式事务的会话 ID 都被赋予值“-2”。
孤立的分布式事务是不与任何会话 ID 关联的分布式事务。 有关详细信息,请参阅使用标记的事务一致地恢复相关的数据库的事务(完全恢复模式)

查询 sys.dm_exec_sessions 的 is_user_process 列以分隔系统进程和用户进程。

权限

要求对服务器具有 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


sp_who2除了显示上面sp_who的输出信息外,还显示下面的信息: (可选参数LoginName, 或active代表活动会话数)

CPUTime (进程占用的总CPU时间)

DiskIO (进程对磁盘读的总次数)

LastBatch (客户最后一次调用存储过程或者执行查询的时间)

ProgramName (用来初始化连接的应用程序名称,或者主机名)

sp_who3是某牛人自定义的存储过程,(可选参数spid),显示“非系统会话,且是活动的会话”的详细情况。

CREATEPROCEDURE sp_who3

( @SessionIDint=NULL)

AS

BEGIN

SELECT

SPID
= er.session_id

,Status = ses.status

,[Login] = ses.login_name

,Host = ses.host_name

,BlkBy = er.blocking_session_id

,DBName =DB_Name(er.database_id)

,CommandType = er.command

,SQLStatement = st.text

,ObjectName =OBJECT_NAME(st.objectid)

,ElapsedMS = er.total_elapsed_time

,CPUTime = er.cpu_time

,IOReads = er.logical_reads+
er.reads

,IOWrites = er.writes

,LastWaitType = er.last_wait_type

,StartTime = er.start_time

,Protocol = con.net_transport

,ConnectionWrites = con.num_writes

,ConnectionReads = con.num_reads

,ClientAddress = con.client_net_address

,Authentication = con.auth_scheme

FROMsys.dm_exec_requests er

OUTERAPPLY sys.dm_exec_sql_text(er.sql_handle)
st

LEFTJOINsys.dm_exec_sessions ses

ON ses.session_id= er.session_id

LEFTJOINsys.dm_exec_connections con

ON con.session_id= ses.session_id

WHERE er.session_id> 50

AND @SessionIDISNULLOR er.session_id=
@SessionID

ORDERBY

er.blocking_session_idDESC

,er.session_id

END

go
http://blog.csdn.net/xiaoxu0123/article/details/5757640
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: