CATCHV Blog

sp_who2 LastBatch 문자열 오류 수정 본문

Database/MS SQL

sp_who2 LastBatch 문자열 오류 수정

catchv 2012. 2. 5. 12:27
반응형

 

Sp_who2의 결과를 보면 LastBatch가 잘못 출력되는 것을 볼 수 있다.

수정 방법은

select

 

spid

,status

,sid

,hostname

,program_name

,cmd

,cpu

,physical_io

,blocked

,dbid

,convert(sysname, rtrim(loginame))

as loginname

,spid as 'spid_sort'

 

, substring( convert(varchar,last_batch,111) ,6 ,5 ) + ' '

-- + substring( convert(varchar,last_batch,113) ,13 ,8 )

+ substring( convert(varchar,last_batch,113) ,12 ,8 )

as 'last_batch_char'

 

13을 12로 수정하면 된다.

그런데 Administrator로 접속한 상태에서 ALTER PROC을 하게 되면 아래와 같은 에러가 난다.

메시지208, 수준16, 상태6, 프로시저sp_who2, 255

개체이름'sys.sp_who2'() 잘못되었습니다.

 

이유가 뭘까요?

DAC로 접속하면 될 것 같은데 아래 쿼리가 더 좋아서 그냥 넘어 간다.

아래는 외국 사이트에서 가져온 DMV를 이용한 sp_who 입니다.

USE master

GO

/***** DMV sp_who *****/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

 

CREATE PROCEDURE sp_who3

(

    @SessionID int = NULL

)

AS

BEGIN

    set nocount on

    

    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 =

                SUBSTRING

                (

                    qt.text,

                    er.statement_start_offset/2,

                    (CASE    WHEN er.statement_end_offset = -1    THEN LEN(CONVERT(nvarchar(MAX), qt.text)) * 2

                            ELSE    er.statement_end_offset

                    END - er.statement_start_offset)/2

                )

        ,    ObjectName = OBJECT_SCHEMA_NAME(qt.objectid,dbid) + '.' + OBJECT_NAME(qt.objectid, qt.dbid)

        ,    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

        ,    transaction_isolation =

            (CASE ses.transaction_isolation_level

                WHEN 0 THEN 'Unspecified'

                WHEN 1 THEN 'Read Uncommitted'

                WHEN 2 THEN 'Read Committed'

                WHEN 3 THEN 'Repeatable'

                WHEN 4 THEN 'Serializable'

                WHEN 5 THEN 'Snapshot'

            END)

        ,    ConnectionWrites = con.num_writes

        ,    ConnectionReads = con.num_reads

        ,    ClientAddress = con.client_net_address

        ,    Authentication = con.auth_scheme

    FROM    sys.dm_exec_requests er

            LEFT JOIN sys.dm_exec_sessions ses

            ON ses.session_id = er.session_id

            LEFT JOIN sys.dm_exec_connections con

            ON con.session_id = ses.session_id

            CROSS APPLY sys.dm_exec_sql_text(er.sql_handle) as qt

    WHERE    @SessionID IS NULL OR er.session_id = @SessionID

            AND er.session_id > 50

    ORDER BY    er.blocking_session_id DESC

            ,    er.session_id

 

END

반응형
Comments