在SQL Server下,是否有一种简单的方法来过滤sp_who2的输出?例如,假设我只想显示某个数据库的行。
当前回答
我写在这里是为了将来自己使用。它使用sp_who2并插入到表变量中,而不是temp表,因为如果不删除temp表,它就不能使用两次。 并显示阻塞和阻塞程序在同一行。
--blocked: waiting becaused blocked by blocker
--blocker: caused blocking
declare @sp_who2 table(
SPID int,
Status varchar(max),
Login varchar(max),
HostName varchar(max),
BlkBy varchar(max),
DBName varchar(max),
Command varchar(max),
CPUTime int,
DiskIO int,
LastBatch varchar(max),
ProgramName varchar(max),
SPID_2 int,
REQUESTID int
)
insert into @sp_who2 exec sp_who2
select w.SPID blocked_spid, w.BlkBy blocker_spid, tblocked.text blocked_text, tblocker.text blocker_text
from @sp_who2 w
inner join sys.sysprocesses pblocked on w.SPID = pblocked.spid
cross apply sys.dm_exec_sql_text(pblocked.sql_handle) tblocked
inner join sys.sysprocesses pblocker on case when w.BlkBy = ' .' then 0 else cast(w.BlkBy as int) end = pblocker.spid
cross apply sys.dm_exec_sql_text(pblocker.sql_handle) tblocker
where pblocked.Status = 'SUSPENDED'
其他回答
是的,通过将sp_who2的输出捕获到表中,然后从表中进行选择,但这是一种糟糕的方式。首先,尽管sp_who2很流行,但它是一个没有文档的过程,您不应该依赖于没有文档的过程。其次,因为所有sp_who2可以做的事情,以及更多的事情,都可以从sys。dm_exec_requests和其他dmv,以及show可以过滤、排序、联接以及可查询行集附带的所有其他功能。
您可以将结果保存到临时表中,但是在master.dbo.sysprocesses上直接访问源代码会更好。
下面的查询将返回与sp_who2几乎完全相同的结果:
SELECT spid,
sp.[status],
loginame [Login],
hostname,
blocked BlkBy,
sd.name DBName,
cmd Command,
cpu CPUTime,
physical_io DiskIO,
last_batch LastBatch,
[program_name] ProgramName
FROM master.dbo.sysprocesses sp
JOIN master.dbo.sysdatabases sd ON sp.dbid = sd.dbid
ORDER BY spid
现在,您可以轻松添加任何ORDER BY或WHERE子句,以获得有意义的输出。
或者,您也可以考虑在SSMS中使用活动监视器(Ctrl + Alt + A)
我写在这里是为了将来自己使用。它使用sp_who2并插入到表变量中,而不是temp表,因为如果不删除temp表,它就不能使用两次。 并显示阻塞和阻塞程序在同一行。
--blocked: waiting becaused blocked by blocker
--blocker: caused blocking
declare @sp_who2 table(
SPID int,
Status varchar(max),
Login varchar(max),
HostName varchar(max),
BlkBy varchar(max),
DBName varchar(max),
Command varchar(max),
CPUTime int,
DiskIO int,
LastBatch varchar(max),
ProgramName varchar(max),
SPID_2 int,
REQUESTID int
)
insert into @sp_who2 exec sp_who2
select w.SPID blocked_spid, w.BlkBy blocker_spid, tblocked.text blocked_text, tblocker.text blocker_text
from @sp_who2 w
inner join sys.sysprocesses pblocked on w.SPID = pblocked.spid
cross apply sys.dm_exec_sql_text(pblocked.sql_handle) tblocked
inner join sys.sysprocesses pblocker on case when w.BlkBy = ' .' then 0 else cast(w.BlkBy as int) end = pblocker.spid
cross apply sys.dm_exec_sql_text(pblocker.sql_handle) tblocker
where pblocked.Status = 'SUSPENDED'
一个非常简单的方法是在EXCEL中创建一个ODBC链接,并从那里运行SP_WHO2。
你可以随时刷新,因为它是EXCEL,一切都可以很容易地操纵!
有相当多好的sp_who3用户存储过程——我相信Adam Machanic做了一个非常好的存储过程,AFAIK。
亚当称之为“谁活跃”: http://whoisactive.com
推荐文章
- 确定记录是否存在的最快方法
- 从现有模式生成表关系图(SQL Server)
- 我如何循环通过一组记录在SQL Server?
- 数据库和模式的区别
- 如何在SQL Server中一次更改多个列
- 外键约束可能导致循环或多条级联路径?
- 如何选择每一行的列值不是独特的
- nvarchar(max)非文本
- 在SQL Server 2008 R2中重命名数据库时出错
- 将数据复制到另一个表中
- 如何在SQL中选择表的最后一条记录?
- 修改列,添加默认约束
- 在存储过程中使用“SET XACT_ABORT ON”有什么好处?
- 如何检查SQL Server文本列是否为空?
- 如何创建一个SQL Server函数“连接”多行从一个子查询到一个单独的分隔字段?