sql >> Base de Datos >  >> RDS >> Sqlserver

Encuentre un objeto en SQL Server (base de datos cruzada)

Hay un esquema llamado INFORMATION_SCHEMA esquema que contiene un conjunto de vistas en tablas del esquema SYS que puede consultar para obtener lo que desea.

Una gran ventaja de INFORMATION_SCHEMA es que los nombres de los objetos son muy fáciles de consultar y fáciles de leer para el usuario. La desventaja del INFORMATION_SCHEMA es que tienes que escribir una consulta para cada tipo de objeto.

El esquema Sys puede parecer un poco críptico al principio, pero tiene la misma información (y más) en un solo lugar.

Comenzaría con una tabla llamada SysObjects (cada base de datos tiene uno) que tiene los nombres de todos los objetos y sus tipos.

Uno podría buscar en una base de datos de la siguiente manera:

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

Ahora, si quisiera restringir esto para buscar solo tablas y procesos almacenados, lo haría

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

Si busca tipos de objetos, encontrará una lista completa de vistas, disparadores, etc.

Ahora, si desea buscar esto en cada base de datos, tendrá que iterar a través de las bases de datos. Puede hacer una de las siguientes cosas:

Si desea buscar en cada base de datos sin ninguna cláusula, use sp_MSforeachdb como se muestra en una respuesta aquí.

Si solo desea buscar bases de datos específicas, use "USE DBName" y luego busque el comando.

Se beneficiará enormemente de tenerlo parametrizado en ese caso. Tenga en cuenta que el nombre de la base de datos en la que está buscando deberá reemplazarse en cada consulta (DatabaseOne, DatabaseTwo...). Mira esto:

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