Sql 检索跨多个数据库运行的存储过程的名称
我正在尝试编写一个报告当前数据库活动的查询。该查询将各种DMV链接在一起,如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。我需要在查询中收集这些信息,因此这两个程序在这里都不相关。) 我们系统中的许多活动都发生在存储过程和函数中。在这个查询中看到这些过程的名称会很好 我的问题是: 如何可靠地显示正在执
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)