Istnieje schemat o nazwie INFORMATION_SCHEMA
schemat, który zawiera zestaw widoków tabel ze schematu SYS, o które możesz zapytać, aby uzyskać to, czego chcesz.
Główna zaleta INFORMATION_SCHEMA
jest to, że nazwy obiektów są bardzo przyjazne dla zapytań i czytelne dla użytkownika. Wadą INFORMATION_SCHEMA
jest to, że musisz napisać jedno zapytanie dla każdego typu obiektu.
Schemat Sys może początkowo wydawać się nieco tajemniczy, ale zawiera wszystkie te same informacje (i więcej) w jednym miejscu.
Zacząłbyś od tabeli o nazwie SysObjects (każda baza danych ma jedną), która zawiera nazwy wszystkich obiektów i ich typy.
W bazie danych można wyszukiwać w następujący sposób:
Select [name] as ObjectName, Type as ObjectType
From Sys.Objects
Where 1=1
and [Name] like '%YourObjectName%'
Teraz, jeśli chcesz ograniczyć to tylko do wyszukiwania tabel i przechowywanych procesów, zrobisz to
Select [name] as ObjectName, Type as ObjectType
From Sys.Objects
Where 1=1
and [Name] like '%YourObjectName%'
and Type in ('U', 'P')
Jeśli wyszukasz typy obiektów, znajdziesz całą listę widoków, wyzwalaczy itp.
Teraz, jeśli chcesz szukać tego w każdej bazie danych, będziesz musiał przejść przez bazy danych. Możesz wykonać jedną z następujących czynności:
Jeśli chcesz przeszukać każdą bazę danych bez żadnych klauzul, użyj sp_MSforeachdb, jak pokazano w odpowiedzi tutaj.
Jeśli chcesz przeszukać tylko określone bazy danych, użyj "USE DBName", a następnie polecenia wyszukiwania.
W takim przypadku bardzo skorzystasz na parametryzacji. Zauważ, że nazwa bazy danych, w której szukasz, będzie musiała zostać zastąpiona w każdym zapytaniu (DatabaseOne, DatabaseTwo...). Sprawdź to:
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')