2009-06-21 9 views
10

Se mi è stato detto un nome di tabella (o proc), ma non quale database connesso è situato l'oggetto, esiste un semplice script per cercarlo? Forse cercare da qualche parte nei database di sistema? (Sto usando SQL Server 2005)Trova un oggetto in SQL Server (cross-database)

risposta

25

C'è uno schema Information_Schema che è un insieme di viste su tabelle dallo schema SYS che è possibile interrogare per ottenere ciò che si desidera.

Lo svantaggio di Information_Schema è che è necessario scrivere una query per ogni tipo di oggetto. Il lato positivo è che Information_Schema è più amichevole da leggere.

Lo schema Sys inizialmente sembrerà un po 'criptico ma ha le stesse informazioni in un singolo punto.

In sostanza, esiste una tabella denominata SysObjects in ciascun database con i nomi di tutti gli oggetti e i relativi tipi.

Quindi, si vorrebbe 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 si voleva limitare tale solo la ricerca di tabelle e stored procedure, si farebbe

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 per visualizzazioni, trigger, ecc.

Ora, se vuoi cercare questo in ogni database, dovrai scorrere attraverso il banche dati. È possibile eseguire una delle seguenti operazioni:

Se si desidera eseguire ricerche in ogni database senza alcuna clausola, utilizzare sp_MSforeachdb come mostrato in una risposta qui.

Se si desidera cercare solo database specifici, utilizzare "USE DBName" e quindi cercare il comando.

Beneficerete enormemente di averlo parametrizzato in quel caso. Si noti che il nome del database che si sta cercando dovrà essere sostituito in ogni query (DatabaseOne, DatabaseTwo ...). Check this out:

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

Qual è il punto di 'DOVE 1 = 1'? – itsho

+2

@itsho, se l'universo si rompe, Raj More non vuole perdere tempo a eseguire query di database. :) – user1172763

+2

@itsho è per la leggibilità del codice. Ogni AND è su una linea separata, e sebbene non sia ovvio nel modo in cui SO ha mostrato il codice, essi sarebbero spesso rientrati. Inoltre, rende sempre più facile commentare qualsiasi/tutte le condizioni. Senza 1 = 1, non è possibile commentare la prima condizione senza rimuovere anche 'AND' nella riga successiva. Quindi, non fa nulla per influenzare la query, ma rende più facile per l'utente che esegue il comando. –

0

È possibile utilizzare sp_MSforeachdb per cercare tutti i database.

dichiarano @RETURN_VALUE int

dichiarare @ command1 nvarchar (2000)

set @ command1 = "Il comando va qui"

exec = @RETURN_VALUE sp_msforeachdb @ command1 = @ command1

Raj

2

Il modo più semplice è di colpire l'information_schemas ...

6
sp_MSforeachdb 'select db_name(), * From ?..sysobjects where xtype in (''U'', ''P'') And name = ''ObjectName''' 

Invece di Inserisci oggetto 'ObjectName' si sta cercando. La prima colonna mostrerà il nome del database su cui si trova l'oggetto.

+8

nome_db() è il database corrente, ''? '' Sarà il database ricercato. Quindi la prima colonna sarà la stessa per tutti i record, se è necessario sapere quale database è in uso l'oggetto: sp_MSforeachdb 'select' '?' ', * From? .. sysobjects dove xtype in (' 'U' ', '' P '') E 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 
Problemi correlati