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
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')
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
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]='????'
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.
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 '' ' –
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
Jaki jest sens "GDZIE 1 = 1"? – itsho
@itsho, jeśli wszechświat się załamie, Raj More nie chce marnować czasu na uruchamianie zapytań do bazy danych. :) – user1172763
@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. –