SQL Server: Filter output of sp_who2

后端 未结 13 2077
长情又很酷
长情又很酷 2020-12-02 03:49

Under SQL Server, is there an easy way to filter the output of sp_who2? Say I wanted to just show rows for a certain database, for example.

相关标签:
13条回答
  • 2020-12-02 04:34

    This is the solution for you: 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') 
    
    0 讨论(0)
  • 2020-12-02 04:36

    You could try something like

    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 ....
    

    And filter on what you require.

    0 讨论(0)
  • 2020-12-02 04:36

    Similar to KyleMit answer, its possible to select directly the tables used by SP_WHO2, although I think it's only need dbo.sysprocesses table.

    If someone open this SP, it can understand what it does. This is my best select to have a similar output as SP_WHO2

    select convert(char(5),sp.spid) as SPID
            ,  CASE lower(sp.status)
                     When 'sleeping' Then lower(sp.status)
                     Else  upper(sp.status)
                  END as Status
            , convert(sysname, rtrim(sp.loginame)) as LOGIN
            , CASE sp.hostname
                     When Null  Then '  .'
                     When ' ' Then '  .'
                     Else    rtrim(sp.hostname)
                  END as HostName
            , CASE isnull(convert(char(5),sp.blocked),'0')
                     When '0' Then '  .'
                     Else isnull(convert(char(5),sp.blocked),'0')
                  END as BlkBy
            , case when sp.dbid = 0 then null when sp.dbid <> 0 then db_name(sp.dbid) end as DBName
            , sp.cmd as Command
            , sp.cpu as CPUTime
            , sp.physical_io as DiskIO
            , sp.last_batch as LastBatch
            , sp.program_name as ProgramName 
            from master.dbo.sysprocesses sp (nolock)
      ;
    

    Over this select, you can select the fields you need and have the order you want.

    0 讨论(0)
  • 2020-12-02 04:37

    I am writing here for future use of my own. It uses sp_who2 and insert into table variable instead of temp table because Temp table cannot be used twice if you do not drop it. And shows blocked and blocker at the same line.

    --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'
    
    0 讨论(0)
  • 2020-12-02 04:39

    There's quite a few good sp_who3 user stored procedures out there - I'm sure Adam Machanic did a really good one, AFAIK.

    Adam calls it Who Is Active: http://whoisactive.com

    0 讨论(0)
  • 2020-12-02 04:39

    I made an improvement in order to obtain not only the blocked processes but also the blocking process:

    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
    
    0 讨论(0)
提交回复
热议问题