Найти объект в SQL Server (кросс-базы данных) - PullRequest
18 голосов
/ 22 июня 2009

Если мне сказали имя таблицы (или процедуры), но не в какой подключенной базе данных находится объект, есть ли какой-нибудь простой скрипт для его поиска? Может быть, искать где-нибудь в системных базах данных? (Я использую SQL Server 2005)

Ответы [ 5 ]

32 голосов
/ 22 июня 2009

Существует схема Information_Schema, представляющая собой набор представлений таблиц из схемы SYS, к которым вы можете обратиться, чтобы получить то, что вам нужно.

Недостатком Information_Schema является то, что вы должны написать один запрос для каждого типа объекта. Плюс в том, что Information_Schema удобнее для чтения.

Схема Sys изначально будет казаться немного загадочной, но в одной и той же информации она содержится.

По сути, в каждой базе данных есть таблица с именем SysObjects, в которой указаны имена всех объектов и их типы.

Итак, вы хотите искать в базе данных следующим образом:

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

Теперь, если вы хотите ограничить это только поиском таблиц и хранимых процедур, вы должны сделать

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

Если вы посмотрите на типы объектов, вы найдете целый список представлений, триггеров и т. Д.

Теперь, если вы хотите найти это в каждой базе данных, вам придется перебирать базы данных. Вы можете сделать одно из следующего:

Если вы хотите выполнить поиск в каждой базе данных без каких-либо предложений, используйте sp_MSforeachdb, как показано в ответе здесь.

Если вы хотите выполнять поиск только в определенных базах данных, используйте «ИСПОЛЬЗОВАТЬ DBName», а затем команду поиска.

В этом случае вы получите большую пользу от параметризации. Обратите внимание, что имя базы данных, в которой вы ведете поиск, будет заменяться в каждом запросе (DatabaseOne, DatabaseTwo ...). Проверьте это:

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')
9 голосов
/ 22 июня 2009
sp_MSforeachdb 'select db_name(), * From ?..sysobjects where xtype in (''U'', ''P'') And name = ''ObjectName'''

Вместо «ObjectName» вставьте объект, который вы ищете. В первом столбце будет отображаться имя базы данных, в которой находится объект.

3 голосов
/ 22 июня 2009

Самый простой способ - воспользоваться информационными схемами ...

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

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

SELECT *
FROM information_schema.Routines
WHERE [Routine_Name]='????'
1 голос
/ 22 июня 2009

Вы можете использовать sp_MSforeachdb для поиска во всех базах данных.

объявляет @RETURN_VALUE int

Declare @ Command1 nvarchar (2000)

set @ command1 = "Ваша команда идет сюда"

exec @RETURN_VALUE = sp_MSforeachdb @ command1 = @ command1

Raj

0 голосов
/ 18 июня 2013
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...