Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Localizar um objeto no SQL Server (entre banco de dados)


Existe um esquema chamado INFORMATION_SCHEMA esquema que contém um conjunto de visualizações em tabelas do esquema SYS que você pode consultar para obter o que deseja.

Uma grande vantagem do INFORMATION_SCHEMA é que os nomes dos objetos são muito fáceis de consultar e legíveis pelo usuário. A desvantagem do INFORMATION_SCHEMA é que você tem que escrever uma consulta para cada tipo de objeto.

O esquema Sys pode parecer um pouco enigmático inicialmente, mas tem todas as mesmas informações (e mais) em um único local.

Você começaria com uma tabela chamada SysObjects (cada banco de dados tem um) que tem os nomes de todos os objetos e seus tipos.

Pode-se pesquisar em um banco de dados da seguinte forma:
Select [name] as ObjectName, Type as ObjectType
From Sys.Objects
Where 1=1
    and [Name] like '%YourObjectName%'

Agora, se você quiser restringir isso para pesquisar apenas tabelas e procs armazenados, você faria
Select [name] as ObjectName, Type as ObjectType
From Sys.Objects
Where 1=1
    and [Name] like '%YourObjectName%'
    and Type in ('U', 'P')

Se você procurar tipos de objetos, encontrará uma lista completa de visualizações, gatilhos etc.

Agora, se você quiser pesquisar isso em cada banco de dados, terá que percorrer os bancos de dados. Você pode fazer um dos seguintes:

Se você quiser pesquisar em cada banco de dados sem nenhuma cláusula, use o sp_MSforeachdb conforme mostrado em uma resposta aqui.

Se você deseja pesquisar apenas bancos de dados específicos, use o comando "USE DBName" e, em seguida, pesquise.

Você se beneficiará muito de tê-lo parametrizado nesse caso. Observe que o nome do banco de dados que você está pesquisando terá que ser substituído em cada consulta (DatabaseOne, DatabaseTwo...). Veja isso:
Declare @ObjectName VarChar (100)

Set @ObjectName = '%Customer%'

Select 'DatabaseOne' as DatabaseName, [name] as ObjectName, Type as ObjectType
From DatabaseOne.Sys.Objects
Where 1=1
    and [Name] like @ObjectName
    and Type in ('U', 'P')

UNION ALL

Select 'DatabaseTwo' as DatabaseName, [name] as ObjectName, Type as ObjectType
From DatabaseTwo.Sys.Objects
Where 1=1
    and [Name] like @ObjectName
    and Type in ('U', 'P')

UNION ALL

Select 'DatabaseThree' as DatabaseName, [name] as ObjectName, Type as ObjectType
From DatabaseThree.Sys.Objects
Where 1=1
    and [Name] like @ObjectName
    and Type in ('U', 'P')