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