2009-06-21 19 views
10

Jeśli powiedziano mi nazwę tabeli (lub proc), ale nie jest to, z którą połączoną bazą danych obiekt się znajduje, czy istnieje prosty skrypt do jej wyszukania? Może gdzieś szukać w bazach danych systemu? (Używam programu SQL Server 2005)Znajdź obiekt w SQL Server (cross-database)

Odpowiedz

25

Istnieje schemat Information_Schema, który jest zbiorem widoków tabel ze schematu SYS, które można wyszukiwać, aby uzyskać to, co chcesz.

Wadą elementu Information_Schema jest napisanie jednego zapytania dla każdego typu obiektu. Plusem jest to, że informacja_Schemat jest również bardziej przyjazny do czytania.

Schemat Sys będzie początkowo trochę tajemniczy, ale ma te same informacje w jednym miejscu.

Zasadniczo w każdej bazie danych znajduje się tabela o nazwie SysObjects, która ma nazwy wszystkich obiektów i ich typów.

Więc, co chcesz wyszukać w bazie danych w następujący sposób:

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

Teraz, jeśli chcesz, aby ograniczyć to tylko szukać stoły i przechowywanych proca, byś

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

Jeśli szukasz typów obiektów, znajdziesz całą listę widoków, wyzwalaczy itp.

Teraz, jeśli chcesz wyszukać to w każdej bazie danych, będziesz musiał wykonać iterację bazy danych. Możesz wykonać jedną z następujących czynności:

Jeśli chcesz przeszukać każdą bazę danych bez żadnych klauzul, użyj sp_MSforeachdb, jak pokazano w odpowiedzi tutaj.

Jeśli chcesz przeszukać tylko określone bazy danych, użyj polecenia "USE DBName", a następnie polecenia wyszukiwania.

Wiele skorzystasz na sparametryzowaniu w tym przypadku. Zauważ, że nazwa bazy danych, której szukasz, będzie musiała zostać zastąpiona w każdym zapytaniu (DatabaseOne, DatabaseTwo ...). Sprawdź to:

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

Jaki jest sens "GDZIE 1 = 1"? – itsho

+2

@itsho, jeśli wszechświat się załamie, Raj More nie chce marnować czasu na uruchamianie zapytań do bazy danych. :) – user1172763

+2

@itsho to dla czytelności kodu. Każde ORAZ jest w osobnej linii i chociaż nie jest to oczywiste w sposobie, w jaki SO wyświetliło kod, często były one wcięte. Ponadto sprawia, że ​​jeszcze łatwiejsze jest komentowanie dowolnych/wszystkich warunków. Bez wartości 1 = 1 nie można skomentować pierwszego warunku bez usunięcia "AND" w następnym wierszu. Nie ma więc wpływu na zapytanie, ale ułatwia użytkownikowi uruchomienie polecenia. –

0

Możesz użyć sp_MSforeachdb do przeszukiwania wszystkich baz danych.

zadeklarować @RETURN_VALUE int

declare @ command1 nvarchar (2000)

zestaw @ command1 = "Twoje polecenia idzie tutaj"

Exec @RETURN_VALUE = sp_MSforeachdb @ command1 = @ command1

Raj

2

Najprostszym sposobem jest podbicie tablicy informacyjnej ...

SELECT * 
FROM information_schema.Tables 
WHERE [Table_Name]='????' 

SELECT * 
FROM information_schema.Views 
WHERE [Table_Name]='????' 

SELECT * 
FROM information_schema.Routines 
WHERE [Routine_Name]='????' 
6
sp_MSforeachdb 'select db_name(), * From ?..sysobjects where xtype in (''U'', ''P'') And name = ''ObjectName''' 

Zamiast 'ObjectName' dodaje obiekt szukasz. Pierwsza kolumna wyświetli nazwę bazy danych, w której znajduje się obiekt.

+8

db_name() jest bieżącą bazą danych, ""? "Będzie przeszukiwaną bazą danych. Tak więc pierwsza kolumna będzie taka sama dla wszystkich rekordów, jeśli potrzebujesz wiedzieć, która baza danych obiekt jest w użyciu: sp_MSforeachdb 'select' '?' ', * From? .. sysobjects gdzie xtype in (' 'U' ', '' P '') I name = '' ObjectName '' ' –

0
set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
go 


/********************************************************************** 
Naziv procedure  : sp_rfv_FIND 
Ime i prezime autora: Srdjan Nadrljanski 
Datum kreiranja  : 13.06.2013. 
Namena    : Traži sql objekat na celom serveru 
Tabele    : 
Ulazni parametri : 
Izlazni parametri : 
Datum zadnje izmene : 
Opis izmene   : 
exec sp_rfv_FIND 'TUN','' 
**********************************************************************/ 
CREATE PROCEDURE [dbo].[sp_rfv_FIND] ( @SEARCHSTRING VARCHAR(255), 
             @notcontain Varchar(255) 
             ) 
AS 


declare @text varchar(1500),@textinit varchar (1500) 
set @textinit= 
'USE @sifra 

insert into ##temp2 
select ''@sifra''as dbName,a.[Object Name],a.[Object Type] 
from(
SELECT DISTINCT sysobjects.name AS [Object Name] , 
case 
when sysobjects.xtype = ''C'' then ''CHECK constraint'' 
when sysobjects.xtype = ''D'' then ''Default or DEFAULT constraint'' 
when sysobjects.xtype = ''F'' then ''Foreign Key'' 
when sysobjects.xtype = ''FN'' then ''Scalar function'' 
when sysobjects.xtype = ''P'' then ''Stored Procedure'' 
when sysobjects.xtype = ''PK'' then ''PRIMARY KEY constraint'' 
when sysobjects.xtype = ''S'' then ''System table'' 
when sysobjects.xtype = ''TF'' then ''Function'' 
when sysobjects.xtype = ''TR'' then ''Trigger'' 
when sysobjects.xtype = ''U'' then ''User table'' 
when sysobjects.xtype = ''UQ'' then ''UNIQUE constraint'' 
when sysobjects.xtype = ''V'' then ''View'' 
when sysobjects.xtype = ''X'' then ''Extended stored procedure'' 
end as [Object Type] 
FROM sysobjects 
WHERE 
sysobjects.type in (''C'',''D'',''F'',''FN'',''P'',''K'',''S'',''TF'',''TR'',''U'',''V'',''X'') 
AND sysobjects.category = 0 
AND CHARINDEX(''@SEARCHSTRING'',sysobjects.name)>0 
AND ((CHARINDEX(''@notcontain'',sysobjects.name)=0 or 
CHARINDEX(''@notcontain'',sysobjects.name)<>0)) 
)a' 

    set @textinit=replace(@textinit,'@SEARCHSTRING',@SEARCHSTRING) 
    set @textinit=replace(@textinit,'@notcontain',@notcontain) 


SELECT name AS dbName,cast(null as varchar(255)) as ObjectName,cast(null as varchar(255)) as ObjectType 
into ##temp1 
from master.dbo.sysdatabases order by name 

SELECT * INTO ##temp2 FROM ##temp1 WHERE 1 = 0 


declare @sifra VARCHAR(255),@suma int,@brojac int 

set @suma=(select count(dbName) from ##temp1) 

DECLARE c_k CURSOR LOCAL FAST_FORWARD FOR 
SELECT dbName FROM ##temp1 ORDER BY dbName DESC 

OPEN c_k 
FETCH NEXT FROM c_K INTO @sifra 
SET @brojac = 1 
WHILE (@@fetch_status = 0) AND (@brojac <= @suma) 
BEGIN 

    set @text=replace(@textinit,'@sifra',@sifra) 

    exec (@text) 

    SET @brojac = @brojac +1 

    DELETE FROM ##temp1 WHERE dbName = @sifra 

     FETCH NEXT FROM c_k INTO @sifra 
END 
close c_k 
DEALLOCATE c_k 

select * from ##temp2 
order by dbName,ObjectType 
drop table ##temp2 
drop table ##temp1