在SQL Server下,是否有一种简单的方法来过滤sp_who2的输出?例如,假设我只想显示某个数据库的行。


当前回答

我做了改进,不仅得到了被阻塞的进程,还得到了阻塞的进程:

DECLARE @Table 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_1 INT, REQUESTID INT
    )

INSERT INTO @Table EXEC sp_who2

SELECT  *
FROM    @Table
WHERE
    BlkBy not like '  .'
    or
    SPID in (SELECT  BlkBy from @Table where BlkBy not like '  .')

delete from @Table

其他回答

一个非常简单的方法是在EXCEL中创建一个ODBC链接,并从那里运行SP_WHO2。

你可以随时刷新,因为它是EXCEL,一切都可以很容易地操纵!

这是你的解决方案: http://blogs.technet.com/b/wardpond/archive/2005/08/01/the-openrowset-trick-accessing-stored-procedure-output-in-a-select-statement.aspx

select * from openrowset ('SQLOLEDB', '192.168.x.x\DATA'; 'user'; 'password', 'sp_who') 

有相当多好的sp_who3用户存储过程——我相信Adam Machanic做了一个非常好的存储过程,AFAIK。

亚当称之为“谁活跃”: http://whoisactive.com

是的,通过将sp_who2的输出捕获到表中,然后从表中进行选择,但这是一种糟糕的方式。首先,尽管sp_who2很流行,但它是一个没有文档的过程,您不应该依赖于没有文档的过程。其次,因为所有sp_who2可以做的事情,以及更多的事情,都可以从sys。dm_exec_requests和其他dmv,以及show可以过滤、排序、联接以及可查询行集附带的所有其他功能。

第一个也是最好的答案的延伸…我已经在主数据库上创建了一个存储过程,然后可以将参数传递给..例如数据库的名称:

USE master
GO

CREATE PROCEDURE sp_who_db
(
    @sDBName varchar(200)   = null,
    @sStatus varchar(200)   = null,
    @sCommand varchar(200)  = null,
    @nCPUTime int           = null
)
AS
DECLARE @Table 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_1 INT,
    REQUESTID INT
)

INSERT INTO @Table EXEC sp_who2

SELECT  *
    FROM    @Table
    WHERE   (@sDBName IS NULL OR DBName = @sDBName)
    AND     (@sStatus IS NULL OR Status = @sStatus)
    AND     (@sCommand IS NULL OR Command = @sCommand)
    AND     (@nCPUTime IS NULL OR CPUTime > @nCPUTime)
GO 

我可以扩展它,添加一个按参数排序的参数,甚至是一个kill参数,这样它就会终止到特定数据的所有连接