SQL Server: Filter output of sp_who2

后端 未结 13 2100
长情又很酷
长情又很酷 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:28

    based on http://web.archive.org/web/20080218124946/http://sqlserver2005.databases.aspfaq.com/how-do-i-mimic-sp-who2.html

    i have created following script ,
    which resolves finding active connections to any datbase using DMV this works under sql 2005 , 2008 and 2008R2

    Following script uses sys.dm_exec_sessions , sys.dm_exec_requests , sys.dm_exec_connections , sys.dm_tran_locks

    Declare @dbName varchar(1000)
    set @dbName='abc'
    
    ;WITH DBConn(SPID,[Status],[Login],HostName,DBName,Command,LastBatch,ProgramName)
    As
    (
    SELECT 
        SPID = s.session_id,
        Status = UPPER(COALESCE
            (
                r.status,
                ot.task_state,
                s.status, 
            '')),
        [Login] = s.login_name,
        HostName = COALESCE
            (
                s.[host_name],
                '  .'
            ),
        DBName = COALESCE
            (
                DB_NAME(COALESCE
                (
                    r.database_id,
                    t.database_id
                )),
                ''
            ),
        Command = COALESCE
            (
                r.Command,
                r.wait_type,
                wt.wait_type,
                r.last_wait_type,
                ''
            ),
        LastBatch = COALESCE
            (
                r.start_time,
                s.last_request_start_time
            ),
        ProgramName = COALESCE
            (
                s.program_name, 
                ''
            )
    FROM
        sys.dm_exec_sessions s
    LEFT OUTER JOIN
        sys.dm_exec_requests r
    ON
        s.session_id = r.session_id
    LEFT OUTER JOIN
        sys.dm_exec_connections c
    ON
        s.session_id = c.session_id
    LEFT OUTER JOIN
    (
        SELECT 
            request_session_id,
            database_id = MAX(resource_database_id)
        FROM
            sys.dm_tran_locks
        GROUP BY
            request_session_id
    ) t
    ON
        s.session_id = t.request_session_id
    LEFT OUTER JOIN
        sys.dm_os_waiting_tasks wt
    ON 
        s.session_id = wt.session_id
    LEFT OUTER JOIN
        sys.dm_os_tasks ot
    ON 
        s.session_id = ot.session_id
    LEFT OUTER JOIN
    (
        SELECT
            ot.session_id,
            CPU_Time = MAX(usermode_time)
        FROM
            sys.dm_os_tasks ot
        INNER JOIN
            sys.dm_os_workers ow
        ON
            ot.worker_address = ow.worker_address
        INNER JOIN
            sys.dm_os_threads oth
        ON
            ow.thread_address = oth.thread_address
        GROUP BY
            ot.session_id
    ) tt
    ON
        s.session_id = tt.session_id
    WHERE
        COALESCE
        (
            r.command,
            r.wait_type,
            wt.wait_type,
            r.last_wait_type,
            'a'
        ) >= COALESCE
        (
            '', 
            'a'
        )
    )
    
    Select * from DBConn
    where DBName like '%'+@dbName+'%'
    

提交回复
热议问题