Sql 检索跨多个数据库运行的存储过程的名称

Sql 检索跨多个数据库运行的存储过程的名称,sql,sql-server,stored-procedures,dynamic-management-views,Sql,Sql Server,Stored Procedures,Dynamic Management Views,我正在尝试编写一个报告当前数据库活动的查询。该查询将各种DMV链接在一起,如sys.dm_exec_连接,sys.dm_exec_会话,sys.dm_exec_请求,等等。该查询还通过sys.dm_exec_sql_text函数提取正在运行的实际查询 (我知道Activity Monitor和SQL Profiler。我需要在查询中收集这些信息,因此这两个程序在这里都不相关。) 我们系统中的许多活动都发生在存储过程和函数中。在这个查询中看到这些过程的名称会很好 我的问题是: 如何可靠地显示正在执

我正在尝试编写一个报告当前数据库活动的查询。该查询将各种DMV链接在一起,如
sys.dm_exec_连接
sys.dm_exec_会话
sys.dm_exec_请求
,等等。该查询还通过
sys.dm_exec_sql_text
函数提取正在运行的实际查询

(我知道Activity Monitor和SQL Profiler。我需要在查询中收集这些信息,因此这两个程序在这里都不相关。)

我们系统中的许多活动都发生在存储过程和函数中。在这个查询中看到这些过程的名称会很好

我的问题是:

如何可靠地显示正在执行的存储过程或函数的名称?

我知道
sys.dm\u exec\u sql\u text
函数返回一个
objectid
,我可以将这个
objectid
连接到
sys.objects
。问题是,此服务器上有多个数据库,sys.objects仅适用于当前数据库。我希望此查询能够显示正在运行的对象名称,而不管查询是针对哪个数据库运行的

到目前为止,我唯一的解决方案是使用
sp_msforeachdb
创建一个临时表,其中包含来自所有数据库的所有对象ID和名称,并通过
dm_exec_sql_text
函数的结果连接到此表

有没有更好的临时表方法解决方案?我觉得我错过了一些东西。

--I使用以下程序:

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 --@CurrentSpid@ 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 使用[母版] 去 创建进程[dbo]。[sp_who3] 作为 不计较 声明@LoginName varchar(128) 声明@AppName varchar(128) 选择[SPID]=s[SPID] ,[CPU]=s[CPU] ,[Physical_IO]=s.[Physical_IO] ,[Blocked]=s[已阻止] ,[LoginName]=CONVERT([sysname],RTRIM(s.[Loginame])) ,[数据库]=d[名称] ,[AppName]=s[程序名称] ,[HostName]=s[HostName] ,[Status]=s[状态] ,[Cmd]=s[Cmd] ,[Last Batch]=s[Last_Batch] ,[Kill命令]=“Kill”+将[spid]转换为varchar(10)) ,[Buffer命令]=“DBCC InputBuffer”(“+CAST(s.[spid]为varchar(10)) + ')' 来自[master].[dbo].[sysprocesses]s,带有(NOLOCK) 将[master].[sys].[databases]d与(NOLOCK)连接 在s.[dbid]=d.[database_id] 其中s.[状态]“背景” 和s[spid]@@spid--@CurrentSpid@ 按s.[blocked]DESC、s.[physical_io]DESC、s.[cpu]DESC、CONVERT([sysname]、RTRIM(s.[Loginame])排序 开始 将事务隔离级别设置为“读取未提交” 选择[Spid]=er。[会话Id] ,[ECID]=sp.[ECID] ,[Database]=DB_名称(sp.[dbid]) ,[User]=[nt\U用户名] ,[Status]=er.[Status] ,[Wait]=[Wait_type] ,[Individual Query]=子字符串(qt.[text],er.[statement\u start\u offset]/2,(如果er.[statement\u end\u offset]=-1,则为LEN(CONVERT(VARCHAR(MAX),qt.[text])*2 ELSE er.[statement\u end\u offset]end-er.[statement\u start\u offset])/2) ,[Parent Query]=qt。[文本] ,[Program]=sp[程序名称] ,[Hostname]=sp.[Hostname] ,[Domain]=sp.[nt_Domain] ,[Start\u time]=er.[Start\u time] 从[sys].[dm_exec_requests]er与(NOLOCK) 将[sys].[SYSPROCESS]sp与(NOLOCK)进行内部连接 在er上。[session_id]=sp.[spid] 交叉应用[sys].[dm_exec_sql_text](er.[sql_handle])qt 其中er.[session_Id]>50——忽略系统SPID。 和er.[session_Id]不在(@@SPID)--忽略当前语句。 由er.[session_Id],sp.[ECID]订购 结束 去 --我使用以下程序:

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 --@CurrentSpid@ 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 使用[母版] 去 创建进程[dbo]。[sp_who3] 作为 不计较 声明@LoginName varchar(128) 声明@AppName varchar(128) 选择[SPID]=s[SPID] ,[CPU]=s[CPU] ,[Physical_IO]=s.[Physical_IO] ,[Blocked]=s[已阻止] ,[LoginName]=CONVERT([sysname],RTRIM(s.[Loginame])) ,[数据库]=d[名称] ,[AppName]=s[程序名称] ,[HostName]=s[HostName] ,[Status]=s[状态] ,[Cmd]=s[Cmd] ,[Last Batch]=s[Last_Batch] ,[Kill命令]=“Kill”+将[spid]转换为varchar(10)) ,[Buffer命令]=“DBCC InputBuffer”(“+CAST(s.[spid]为varchar(10)) + ')' 来自[master].[dbo].[sysprocesses]s,带有(NOLOCK) 将[master].[sys].[databases]d与(NOLOCK)连接 在s.[dbid]=d.[database_id] 其中s.[状态]“背景” 和s[spid]@@spid--@CurrentSpid@ 按s.[blocked]DESC、s.[physical_io]DESC、s.[cpu]DESC、CONVERT([sysname]、RTRIM(s.[Loginame])排序 开始 将事务隔离级别设置为“读取未提交” 选择[Spid]=er。[会话Id] ,[ECID]=sp.[ECID] ,[Database]=DB_名称(sp.[dbid]) ,[User]=[nt\U用户名] ,[Status]=er.[Status] ,[Wait]=[Wait_type] ,[Individual Query]=子字符串(qt.[text],er.[statement\u start\u offset]/2,(如果er.[statement\u end\u offset]=-1,则为LEN(CONVERT(VARCHAR(MAX),qt.[text])*2 ELSE er.[statement\u end\u offset]end-er.[statement\u start\u offset])/2) ,[Parent Query]=qt。[文本] ,[Program]=sp[程序名称] ,[Hostname]=sp.[Hostname] ,[Domain]=sp.[nt_Domain] ,[Start\u time]=er.[Start\u time] 从[sys].[dm_exec_requests]er与(NOLOCK) 将[sys].[SYSPROCESS]sp与(NOLOCK)进行内部连接 在er上。[session_id]=sp.[spid] 交叉应用[sys].[dm_exec_sql_text](e)