星期五, 1月 11, 2013

看看SQL Server在跑什麼SQL

最近常常發生sp_who2看到一堆連線,有些還在跑,這時候想要把它Kill掉前就一定要檢查一下它在執行什麼了,偏偏sp_who2就只能看到正在跑,看不到執行什麼指令,還好網路上真的是一個很方便的地方,馬上就找到指令了

  1. SELECT      r.scheduler_id as 排程器識別碼,  
  2.             status         as 要求的狀態,  
  3.             r.session_id   as SPID,  
  4.             r.blocking_session_id as BlkBy,  
  5.             substring(  
  6.                 ltrim(q.text),  
  7.                 r.statement_start_offset/2+1,  
  8.                 (CASE  
  9.                  WHEN r.statement_end_offset = -1  
  10.                  THEN LEN(CONVERT(nvarchar(MAX), q.text)) * 2  
  11.                  ELSE r.statement_end_offset  
  12.                  END - r.statement_start_offset)/2)  
  13.                  AS [正在執行的 T-SQL 命令],  
  14.             r.cpu_time      as [CPU Time(ms)],  
  15.             r.start_time    as [開始時間],  
  16.             r.total_elapsed_time as [執行總時間],  
  17.             r.reads              as [讀取數],  
  18.             r.writes             as [寫入數],  
  19.             r.logical_reads      as [邏輯讀取數],  
  20.             -- q.text, /* 完整的 T-SQL 指令碼 */  
  21.             d.name               as [資料庫名稱]  
  22. FROM        sys.dm_exec_requests r   
  23.             CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS q  
  24.             LEFT JOIN sys.databases d ON (r.database_id=d.database_id)  
  25. WHERE       r.session_id > 50 AND r.session_id <> @@SPID  
  26. ORDER BY    r.total_elapsed_time desc  


結果在執行的時後會發生sql_handle錯誤,原來這指令只能在SQL Server 2005以上使用,但是我們的資料庫相容性設定為SQL Server 2000,所以將資料庫相容性設定為SQL Server 2005就可以執行了。

出處: http://blog.miniasp.com/post/2010/10/13/How-to-get-current-executing-statements-in-SQL-Server.aspx

沒有留言: