sql >> Database >  >> RDS >> Sqlserver

Zoek een object in SQL Server (cross-database)

Er is een schema met de naam INFORMATION_SCHEMA schema dat een set weergaven van tabellen uit het SYS-schema bevat die u kunt opvragen om te krijgen wat u wilt.

Een groot voordeel van de INFORMATION_SCHEMA is dat de objectnamen zeer vraagvriendelijk en leesbaar voor de gebruiker zijn. Het nadeel van de INFORMATION_SCHEMA is dat je voor elk type object één query moet schrijven.

Het Sys-schema lijkt in eerste instantie misschien een beetje cryptisch, maar het heeft dezelfde informatie (en meer) op één plek.

Je zou beginnen met een tabel met de naam SysObjects (elke database heeft er een) met de namen van alle objecten en hun typen.

Men zou als volgt in een database kunnen zoeken:

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

Als u dit nu wilt beperken tot alleen zoeken naar tabellen en opgeslagen processen, zou u dat doen

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

Als je objecttypes opzoekt, vind je een hele lijst met views, triggers, etc.

Als u hier nu in elke database naar wilt zoeken, moet u de databases doorlopen. U kunt een van de volgende dingen doen:

Als u elke database wilt doorzoeken zonder enige clausules, gebruik dan de sp_MSforeachdb zoals weergegeven in een antwoord hier.

Als u alleen in specifieke databases wilt zoeken, gebruik dan de "USE DBName" en dan het zoekcommando.

In dat geval heeft u er veel baat bij om het te parametreren. Merk op dat de naam van de database waarin u zoekt in elke zoekopdracht moet worden vervangen (DatabaseOne, DatabaseTwo...). Bekijk dit eens:

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. Ongeldige XML-indeling - Hoe dit te voorkomen?

  2. Ontwerp om het in- en uitchecken van werknemers weer te geven

  3. Hoe DENSE_RANK() werkt in SQL Server

  4. Hoe EXISTS Logical Operator te gebruiken in SQL Server - SQL Server / TSQL Tutorial Part 125