2009-06-21 21 views
10

Si me han dicho el nombre de una tabla (o proc), pero no la base de datos conectada en la que se encuentra el objeto, ¿hay algún script simple para buscarla? ¿Tal vez buscar en alguna parte de las Bases de Datos del Sistema? (Estoy usando SQL Server 2005)Buscar un objeto en SQL Server (base de datos cruzada)

Respuesta

25

Hay un esquema Information_Schema que es un conjunto de vistas en tablas del esquema SYS que puede consultar para obtener lo que desea.

La desventaja de Information_Schema es que debe escribir una consulta para cada tipo de objeto. Al revés es que Information_Schema es más amigable de leer también.

El esquema de Sys inicialmente parecerá un poco críptico pero tiene la misma información en un solo lugar.

Básicamente, hay una tabla llamada SysObjects en cada base de datos que tiene los nombres de todos los objetos y sus tipos.

Por lo tanto, usted quiere buscar en una base de datos de la siguiente manera:

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

Ahora, si desea restringir esta sólo a buscar las tablas y procedimientos almacenados, que haría

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

Si busca tipos de objetos, encontrará una lista completa de vistas, desencadenadores, etc.

Ahora, si desea buscar esto en cada base de datos, tendrá que recorrer el bases de datos. Puede hacer una de las siguientes cosas:

Si desea buscar a través de cada base de datos sin ninguna cláusula, utilice el sp_MSforeachdb como se muestra en la respuesta aquí.

Si solo desea buscar bases de datos específicas, use el "USE DBName" y luego busque el comando.

Se beneficiará enormemente de tenerlo parametrizado en ese caso. Tenga en cuenta que el nombre de la base de datos que está buscando tendrá que ser reemplazado en cada consulta (DatabaseOne, DatabaseTwo ...). Mira esto:

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

¿Cuál es el punto de 'WHERE 1 = 1'? – itsho

+2

@itsho, si el universo se rompe, Raj More no quiere perder tiempo ejecutando consultas de bases de datos. :) – user1172763

+2

@itsho es para la legibilidad del código. Cada AND está en una línea separada, y aunque no es obvio en la forma en que SO ha mostrado el código, a menudo se sangrarían. Además, hace que sea aún más fácil comentar cualquier condición. Sin el 1 = 1, no puede comentar la primera condición sin eliminar también el 'Y' en la siguiente línea. Por lo tanto, no afecta en nada la consulta, pero hace que sea más fácil para el usuario que ejecuta el comando. –

0

Puede usar sp_MSforeachdb para buscar en todas las bases de datos.

declaran @RETURN_VALUE int

declare @ comando1 nvarchar (2000)

conjunto @ comando1 = "Su comando va aquí"

ejecutivo @RETURN_VALUE = sp_MSforeachdb @ comando1 = @ comando1

Raj

2

La forma más fácil es presionar up the information_schemas ...

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

En lugar de objeto de inserción 'ObjectName' que está buscando. La primera columna mostrará el nombre de la base de datos donde se encuentra el objeto en.

+8

db_name() es la base de datos actual, ''? '' Será la base de datos que se busca. Entonces, la primera columna será la misma para todos los registros, si necesita saber en qué base de datos está trabajando el objeto: sp_MSforeachdb 'select' '?' ', * From? .. sysobjects donde xtype in (' 'U' ', '' P '') Y 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 
Cuestiones relacionadas