Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Suchen eines Objekts in SQL Server (datenbankübergreifend)

Es gibt ein Schema namens INFORMATION_SCHEMA Schema, das eine Reihe von Ansichten auf Tabellen aus dem SYS-Schema enthält, die Sie abfragen können, um das zu bekommen, was Sie wollen.

Ein großer Vorteil des INFORMATION_SCHEMA ist, dass die Objektnamen sehr abfragefreundlich und benutzerlesbar sind. Die Kehrseite des INFORMATION_SCHEMA ist, dass Sie für jeden Objekttyp eine Abfrage schreiben müssen.

Das Sys-Schema mag anfangs etwas kryptisch erscheinen, aber es enthält dieselben Informationen (und mehr) an einer einzigen Stelle.

Sie würden mit einer Tabelle namens SysObjects beginnen (jede Datenbank hat eine), die die Namen aller Objekte und ihrer Typen enthält.

Man könnte in einer Datenbank wie folgt suchen:

Select [name] as ObjectName, Type as ObjectType
From Sys.Objects
Where 1=1
    and [Name] like '%YourObjectName%'

Wenn Sie dies nun darauf beschränken wollten, nur nach Tabellen und gespeicherten Prozessen zu suchen, würden Sie das tun

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

Wenn Sie nach Objekttypen suchen, finden Sie eine ganze Liste für Ansichten, Trigger usw.

Wenn Sie nun in jeder Datenbank danach suchen möchten, müssen Sie die Datenbanken durchlaufen. Sie können einen der folgenden Schritte ausführen:

Wenn Sie jede Datenbank ohne Klauseln durchsuchen möchten, verwenden Sie die sp_MSforeachdb wie in einer Antwort hier gezeigt.

Wenn Sie nur bestimmte Datenbanken durchsuchen möchten, verwenden Sie den "USE DBName" und dann den Suchbefehl.

In diesem Fall profitieren Sie sehr von einer Parametrierung. Beachten Sie, dass der Name der Datenbank, in der Sie suchen, in jeder Abfrage ersetzt werden muss (DatabaseOne, DatabaseTwo...). Sehen Sie sich das an:

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')