0

我試圖編寫一個報告當前數據庫活動的查詢。查詢將各種DMV鏈接在一起,如sys.dm_exec_connections,sys.dm_exec_sessions,sys.dm_exec_requests等。該查詢還通過sys.dm_exec_sql_text函數提取正在運行的實際查詢。檢索跨多個數據庫運行存儲過程的名稱

(我知道活動監視器和SQL事件探查器的。我需要在查詢中收集這些信息了,所以沒有這些程序是與此有關。)

很多行爲在我們的系統發生在存儲過程和函數中。在此查詢中查看這些過程的名稱將很高興。

我的問題是:

如何可靠地顯示存儲過程或函數的名稱被執行?

我知道,sys.dm_exec_sql_text函數返回一個objectid,那我可以加入此objectidsys.objects。問題是,此服務器上有多個數據庫,並且sys.objects僅適用於當前數據庫。我希望此查詢能夠顯示正在運行的對象名稱,而不管查詢碰巧運行的是哪個數據庫。

到目前爲止,我唯一的解決方案是使用sp_msforeachdb創建一個臨時表,其中包含所有數據庫中的所有對象ID和名稱,並從dm_exec_sql_text函數的結果中加入此表。

是否有更好的解決方案臨時表方法?我覺得我失去了一些東西。

回答

3

我會建議亞當Machanic的優秀sp_WhoISActive。它不會返回確切的對象名稱,但會返回以良好可點擊的形式執行的sql命令。

+0

謝謝你的迴應。鏈接很好,我以前從未見過亞當的工作。 Ny問題是關於對象名稱的,但是在閱讀他的proc之後,我意識到我可以使用動態SQL。我會將其標記爲答案。 – 2011-02-28 15:01:59

1

- 我使用下面的PROC:

USE [master] 
GO 

CREATE PROC [dbo].[sp_who3] 
AS 

    SET NOCOUNT ON 

    DECLARE @LoginName varchar(128) 
    DECLARE @AppName varchar(128) 

    SELECT [SPID] = s.[spid] 
     , [CPU] = s.[cpu] 
     , [Physical_IO] = s.[physical_io] 
     , [Blocked] = s.[blocked] 
     , [LoginName] = CONVERT([sysname], RTRIM(s.[Loginame])) 
     , [Database] = d.[name] 
     , [AppName] = s.[program_name] 
     , [HostName] = s.[hostname] 
     , [Status] = s.[Status] 
     , [Cmd] = s.[cmd] 
     , [Last Batch] = s.[last_batch] 
     , [Kill Command] = 'Kill ' + CAST(s.[spid] AS varchar(10)) 
     , [Buffer Command] = 'DBCC InputBuffer(' + CAST(s.[spid] AS varchar(10)) 
                 + ')' 
    FROM [master].[dbo].[sysprocesses] s WITH(NOLOCK) 
    JOIN [master].[sys].[databases] d WITH(NOLOCK) 
       ON s.[dbid] = d.[database_id] 
    WHERE s.[Status] 'background' 
     AND s.[spid] @@SPID [email protected]@ 
    ORDER BY s.[blocked] DESC, s.[physical_io] DESC, s.[cpu] DESC, CONVERT([sysname], RTRIM(s.[Loginame])) 

    BEGIN 
     SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

     SELECT [Spid] = er.[session_Id] 
     , [ECID] = sp.[ECID] 
     , [Database] = DB_NAME(sp.[dbid]) 
     , [User] = [nt_username] 
     , [Status] = er.[status] 
     , [Wait] = [wait_type] 
     , [Individual Query] = SUBSTRING(qt.[text], er.[statement_start_offset]/2, (CASE WHEN er.[statement_end_offset] = - 1 THEN LEN(CONVERT(VARCHAR(MAX), qt.[text])) * 2 
          ELSE er.[statement_end_offset] END - er.[statement_start_offset])/2) 
     , [Parent Query] = qt.[text] 
     , [Program] = sp.[program_name] 
     , [Hostname] = sp.[Hostname] 
     , [Domain] = sp.[nt_domain] 
     , [Start_time] = er.[Start_time] 
     FROM [sys].[dm_exec_requests] er WITH(NOLOCK) 
     INNER JOIN [sys].[sysprocesses] sp WITH(NOLOCK) 
       ON er.[session_id] = sp.[spid] 
     CROSS APPLY [sys].[dm_exec_sql_text](er.[sql_handle]) qt 
     WHERE er.[session_Id] > 50      -- Ignore system spids. 
      AND er.[session_Id] NOT IN (@@SPID)  -- Ignore the current statement. 
     ORDER BY er.[session_Id], sp.[ECID] 
    END 
GO 
+0

謝謝你的迴應。請注意,我的問題是關於跨多個數據庫的對象的名稱。此外,我建議包括等待時間和各種性能數據,如讀取,寫入,打開的事務,使用的內存等,這些可在各種DMV上使用。 – 2011-02-28 14:48:06