Technical Article

Search for an object across multiple databases on a server.

,

Set @searchKey='log'

Will return all objects that contains the name "log".

-----------------

Declare @searchKey varchar (100)
Declare @SearchObjectNameSql nvarchar (1000)
Declare @SearchObjectDefinitionSql nvarchar (1000)
DECLARE @SearchObjectDefinition bit
DECLARE @DbName sysname 

/*Do not set DBName to search across all databases*/--SELECT @DbName=DB_NAME() 

SET @searchKey='SearchObjectName'

SET @SearchObjectDefinition = 1
/*Change to 1 to search for SP text,Job step etc*/
SELECT
 @SearchObjectNameSql = 'USE [?];select ''?'' DB ,name,null,type_desc from sys.objects where name like ''%@searchKey%'''
SELECT
 @SearchObjectNameSql = REPLACE(@SearchObjectNameSql, '@searchKey', @searchKey)
SELECT
 @SearchObjectDefinitionSql = 'USE [?];select DISTINCT ''?'' DB ,so.name,
m.[definition],
so.type_desc
FROM 
sys.sql_modules m
join
sys.objects so
ON m.object_id=so.object_id
WHERE m.[definition] like ''%@searchKey%''
'
SELECT
 @SearchObjectDefinitionSql = REPLACE(@SearchObjectDefinitionSql, '@searchKey', @searchKey)


Declare @List Table
(
DBName varchar (500),
ObjectName varchar (1000),
ObjectDefinition nvarchar (max),
Type varchar (100)
)

IF @DbName IS NULL
BEGIN
  INSERT @List
  EXECUTE master.sys.sp_MSforeachdb @SearchObjectNameSql

IF @SearchObjectDefinition = 1
BEGIN
INSERT @List
    EXECUTE master.sys.sp_MSforeachdb @SearchObjectDefinitionSql
END
END
ELSE
BEGIN
  select @SearchObjectNameSql=replace(@SearchObjectNameSql,'?',@DbName)

  select @SearchObjectDefinitionSql=REPLACE(@SearchObjectDefinitionSql,'?',@DbName)
  
  INSERT @List
  execute sp_executesql @SearchObjectNameSql

  IF @SearchObjectDefinition = 1
  BEGIN
  INSERT @List
  execute sp_executesql @SearchObjectDefinitionSql
  END
END
IF EXISTS (SELECT
 1
FROM sys.databases
WHERE name = 'msdb')
BEGIN
INSERT @List
 SELECT
  'msdb',
  j.name,
  js.command,
  'SQL_JOB'
 FROM msdb.dbo.sysjobs j
 JOIN msdb.dbo.sysjobsteps js
  ON js.job_id = j.job_id
 JOIN master.dbo.sysservers s
  ON s.srvid = j.originating_server_id
 WHERE js.command LIKE N'%' + @searchKey + '%'
END



IF @SearchObjectDefinition = 0
BEGIN
SELECT
 DBName,
 ObjectName,
 Type
FROM @List
ORDER BY DBName, ObjectName
END
ELSE
BEGIN
SELECT
 DBName,
 ObjectName,
 ObjectDefinition,
 CASE
  WHEN ObjectDefinition IS NULL THEN Type + '_NAME' ELSE Type + '_DEFINITION'
 END
 Type
FROM @List
ORDER BY DBName, ObjectName
END

Rate

3 (8)

You rated this post out of 5. Change rating

Share

Share

Rate

3 (8)

You rated this post out of 5. Change rating