[SQL Server] sp_who, sp_who2和sp_who3

来源:互联网 发布:艾瑞网怎么查数据 编辑:程序博客网 时间:2024/05/01 19:52

[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;GOEXEC sp_who;GO

B.列出特定用户的进程

以下示例显示如何通过登录名查看有关单个当前用户的信息。

USE master;GOEXEC sp_who 'janetl';GO

C.显示所有活动进程

USE master;GOEXEC sp_who 'active';GO

D.显示会话 ID 标识的特定进程

USE master;GOEXEC 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