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 |
'Database > MS SQL' 카테고리의 다른 글
SQL Server OPENROWSET (0) | 2012.02.16 |
---|---|
특정 문자로 구분되는 데이터 분리 Query (split) (0) | 2012.02.06 |
SQL Profiler 결과 데이터베이스로 읽어오기 (0) | 2012.02.04 |
MS SQL Server 2008 Excel 파일 불러오기 (0) | 2011.11.03 |
sp_MSforeachdb 와 sp_MSforeachtable (0) | 2011.09.28 |