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

Find et objekt i SQL Server (cross-database)

Der er et skema kaldet INFORMATION_SCHEMA skema, som indeholder et sæt visninger af tabeller fra SYS-skemaet, som du kan forespørge på for at få det, du ønsker.

En stor fordel ved INFORMATION_SCHEMA er, at objektnavnene er meget forespørgselsvenlige og brugerlæselige. Ulempen ved INFORMATION_SCHEMA er, at du skal skrive en forespørgsel for hver type objekt.

Sys-skemaet kan virke lidt kryptisk i starten, men det har alle de samme oplysninger (og mere) på et enkelt sted.

Du vil starte med en tabel kaldet SysObjects (hver database har en), der har navnene på alle objekter og deres typer.

Man kunne søge i en database som følger:

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

Hvis du nu ville begrænse dette til kun at søge efter tabeller og lagrede processer, ville du gøre det

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

Hvis du slår objekttyper op, finder du en hel liste over visninger, triggere osv.

Nu, hvis du vil søge efter dette i hver database, bliver du nødt til at iterere gennem databaserne. Du kan gøre et af følgende:

Hvis du vil søge gennem hver database uden nogen klausuler, så brug sp_MSforeachdb som vist i et svar her.

Hvis du kun ønsker at søge i bestemte databaser, skal du bruge "USE DBName" og derefter søgekommandoen.

Du vil have stor gavn af at få den parametriseret i så fald. Bemærk, at navnet på den database, du søger i, skal udskiftes i hver forespørgsel (DatabaseOne, DatabaseTwo...). Tjek dette ud:

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. SQL Server kumulativ sum efter gruppe

  2. Hvad kan forårsage intermitterende ORA-12519 (TNS:ingen passende handler fundet) fejl

  3. PostgreSQL-procesnavne på Solaris

  4. Digital transformation:Det hele starter med datatænkning