Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Rechercher un objet dans SQL Server (base de données croisée)

Il existe un schéma appelé INFORMATION_SCHEMA schéma qui contient un ensemble de vues sur les tables du schéma SYS que vous pouvez interroger pour obtenir ce que vous voulez.

Un avantage majeur du INFORMATION_SCHEMA est que les noms d'objet sont très conviviaux pour les requêtes et lisibles par l'utilisateur. L'inconvénient du INFORMATION_SCHEMA est que vous devez écrire une requête pour chaque type d'objet.

Le schéma Sys peut sembler un peu énigmatique au départ, mais il contient toutes les mêmes informations (et plus) au même endroit.

Vous commencerez avec une table appelée SysObjects (chaque base de données en a une) qui contient les noms de tous les objets et leurs types.

On pourrait chercher dans une base de données comme suit :

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

Maintenant, si vous vouliez limiter cela à la recherche de tables et de procs stockés, vous le feriez

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

Si vous recherchez des types d'objets, vous trouverez toute une liste de vues, de déclencheurs, etc.

Maintenant, si vous voulez rechercher ceci dans chaque base de données, vous devrez parcourir les bases de données. Vous pouvez effectuer l'une des actions suivantes :

Si vous souhaitez effectuer une recherche dans chaque base de données sans aucune clause, utilisez le sp_MSforeachdb comme indiqué dans une réponse ici.

Si vous souhaitez uniquement rechercher des bases de données spécifiques, utilisez la commande "USE DBName" puis recherchez.

Vous bénéficierez grandement de l'avoir paramétré dans ce cas. Notez que le nom de la base de données dans laquelle vous recherchez devra être remplacé dans chaque requête (DatabaseOne, DatabaseTwo...). Regardez ceci :

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