Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Trova un oggetto in SQL Server (in più database)

Esiste uno schema chiamato INFORMATION_SCHEMA schema che contiene una serie di viste sulle tabelle dello schema SYS a cui puoi eseguire query per ottenere ciò che desideri.

Un importante vantaggio di INFORMATION_SCHEMA è che i nomi degli oggetti sono molto semplici da interrogare e leggibili dall'utente. Lo svantaggio di INFORMATION_SCHEMA è che devi scrivere una query per ogni tipo di oggetto.

Lo schema Sys può sembrare un po' criptico inizialmente, ma ha tutte le stesse informazioni (e più) in un unico punto.

Inizierai con una tabella chiamata SysObjects (ogni database ne ha uno) che ha i nomi di tutti gli oggetti e i loro tipi.

Si potrebbe cercare in un database come segue:

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

Ora, se volessi limitare questo alla ricerca solo di tabelle e processi memorizzati, lo faresti

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

Se cerchi i tipi di oggetto, troverai un intero elenco di visualizzazioni, attivatori, ecc.

Ora, se vuoi cercare questo in ogni database, dovrai scorrere i database. Puoi eseguire una delle seguenti operazioni:

Se vuoi cercare in ogni database senza alcuna clausola, usa sp_MSforeachdb come mostrato in una risposta qui.

Se vuoi cercare solo database specifici, usa "USE DBName" e poi il comando di ricerca.

In questo caso trarrai grandi vantaggi dall'averlo parametrizzato. Si noti che il nome del database in cui si sta effettuando la ricerca dovrà essere sostituito in ogni query (DatabaseOne, DatabaseTwo...). Dai un'occhiata:

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