我有这样做的东西,多一点是以下过程。应循环访问给定实例上的所有数据库,在这些dbs中的对象定义中查找关键字,以及是否有任何作业使用这些对象及其最后执行持续时间。
USE [master]
GO
Create Proc dbo.DependencyCheck @SearchKey Varchar(150) As
Begin
--DB Refs
Drop Table If Exists #Databases
Create Table #Databases
(
DatabaseName Varchar(50) Primary Key
,Checked Int Default 0 Not Null
,SearchKey Varchar(150)
,DependencyText As 'Insert Into #Dependencies
Select Distinct '
+ '''' + DatabaseName + '''' +
',
D.id As ObjectID,
O.name As ObjectName,
xtype As ObjectType,
S.name As SchemaName
From '
+ DatabaseName + '.dbo.syscomments D
Inner Join ' + DatabaseName + '.dbo.sysobjects O
On O.ID = D.id
Inner Join ' + DatabaseName + '.sys.schemas As S
On s.schema_id = O.uid
Where D.text Like ''%' + SearchKey + '%'''
)
Insert Into #Databases (DatabaseName, SearchKey)
Select
Name, @SearchKey
From sys.sysdatabases As S
Where S.filename Not Like '%.SS' --Not DB Snapshots
Declare @TargetDatabase Varchar(25) = (Select Top 1 DatabaseName From #Databases As D Where D.Checked = 0)
--Dependency Table
Drop Table If Exists #Dependencies
Create Table #Dependencies
(
DatabaseName Varchar(50) Not Null,
ObjectID Int Not Null,
ObjectName Varchar(150) Not Null,
ObjectType Varchar(15) Not Null,
SchamaName Varchar(150) Not null
)
--Dynamic SQL for Insert
Declare @DynamicDependency Varchar(8000) = (Select D.DependencyText From #Databases As D Where D.DatabaseName = @TargetDatabase)
While @TargetDatabase Is Not Null
Begin
Exec(@DynamicDependency)
Update D Set Checked = 1 From #Databases D Where DatabaseName = @TargetDatabase
Set @TargetDatabase = (Select Top 1 DatabaseName From #Databases As D Where D.Checked = 0)
Set @DynamicDependency = (Select D.DependencyText From #Databases As D Where D.DatabaseName = @TargetDatabase)
End
;With JobStats As
(
Select Distinct
J.name,
JH.step_id,
First_Value(JH.run_duration) Over (Partition By J.name, JH.step_id Order By CA.StartTime Desc) As Last_Duration,
Avg(JH.run_duration) Over (Partition By J.name, JH.step_id) As Avg_Duration
From msdb.dbo.sysjobhistory As JH
Cross Apply (Select Convert(Datetime, Convert(varchar(8),run_date))
+ Convert(datetime, Stuff(STUFF(RIGHT(REPLICATE('0', 6) + CAST(run_time as varchar(6)), 6), 3, 0, ':'), 6, 0, ':')) As StartTime) CA
Inner Join msdb.dbo.sysjobs As J
On J.job_id = JH.job_id
Where JH.step_id <> 0
And JH.run_status = 1 -- Success
)
Select
D.ObjectID
,D.DatabaseName
,D.SchamaName
,D.ObjectName
,D.ObjectType
,J.name As JobName
,JS.step_id As JoBStepID
,JS.step_name As JobStepName
,JStat.Last_Duration
,JStat.Avg_Duration
From #Dependencies As D
Left Join msdb.dbo.sysjobsteps JS
On JS.command Like '%' + D.ObjectName + '%'
And JS.subsystem = 'TSQL'
Left Join msdb.dbo.sysjobs J
On J.job_id = JS.job_id
Left Join JobStats JStat
On JStat.name = J.name
And JStat.step_id = JS.step_id
Order By 1, 3
End
这很好,谢谢! – yoelbenyossef