sql >> Databasteknik >  >> RDS >> Sqlserver

Hitta ett objekt i SQL Server (korsdatabas)

Det finns ett schema som heter INFORMATION_SCHEMA schema som innehåller en uppsättning vyer på tabeller från SYS-schemat som du kan fråga för att få vad du vill ha.

En stor fördel med INFORMATION_SCHEMA är att objektnamnen är mycket frågevänliga och användarläsbara. Nackdelen med INFORMATION_SCHEMA är att du måste skriva en fråga för varje typ av objekt.

Sys-schemat kan verka lite kryptiskt till en början, men det har samma information (och mer) på en enda plats.

Du skulle börja med en tabell som heter SysObjects (varje databas har en) som har namnen på alla objekt och deras typer.

Man kan söka i en databas enligt följande:

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

Om du nu vill begränsa detta till att bara söka efter tabeller och lagrade processer, skulle du göra det

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

Om du slår upp objekttyper hittar du en hel lista för vyer, triggers etc.

Nu, om du vill söka efter detta i varje databas, måste du iterera genom databaserna. Du kan göra något av följande:

Om du vill söka igenom varje databas utan några klausuler, använd sedan sp_MSforeachdb som visas i ett svar här.

Om du bara vill söka i specifika databaser, använd "USE DBName" och sedan sökkommandot.

Du kommer att ha stor nytta av att ha den parametriserad i så fall. Observera att namnet på databasen du söker i måste ersättas i varje fråga (DatabaseOne, DatabaseTwo...). Kolla in det här:

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


  1. iOS - Bästa metoder för synkronisering av kärndata och serverdatabas

  2. MySQL SKAPA ANVÄNDARE med en variabel?

  3. Unik nyckel i Oracle med exempel

  4. Välj ett slumpmässigt urval av resultat från ett frågeresultat