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
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')
È 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
Il modo più semplice è di colpire l'information_schemas ...
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.
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 '' ' –
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
- 1. Nome oggetto server SQL
- 2. Trova tabella bloccata in SQL Server
- 3. Posso salvare un 'oggetto' in un database SQL Server?
- 4. SQL Server 2008 Spatial: trova un punto nel poligono
- 5. Trova il numero inutilizzato più piccolo in SQL Server
- 6. SQL Server: trova elementi condivisi in 2 colonne
- 7. Trova record duplicati in una tabella utilizzando SQL Server
- 8. Trova la data più vicina in SQL Server
- 9. Trova la dimensione di più database in SQL Server 2005
- 10. Come verificare l'esistenza di un oggetto SQL Server e rilasciarlo?
- 11. SQL in SQL Server
- 12. Trova tutti i riferimenti a un oggetto in pitone
- 13. Trova l'utilizzo di una funzione nel server SQL
- 14. SQL Server CTE -Trova genitore superiore perOid childID?
- 15. SQL Server trova e sostituisce nel campo TESTO
- 16. SQL Server Trova quali lavori stanno eseguendo una procedura
- 17. Trova una tabella su più database SQL SERVER 2005
- 18. Trova caratteri non ASCII nelle colonne varchar utilizzando SQL Server
- 19. Come liberare un oggetto che si trova in un record?
- 20. Dove si trova SQL Query Analyzer in SQL Server Management Studio 2012
- 21. Trova metodi Oggetto R
- 22. Trova la dimensione di un oggetto polimorfico
- 23. [Microsoft] [SQL Server Native Client 11.0] [SQL Server] Nome oggetto non valido
- 24. RaiseError in SQL Server
- 25. alfanumerica in SQL Server
- 26. in SQL Server
- 27. Arrotondare in SQL Server?
- 28. Intersect in SQL Server
- 29. Rinominare un vincolo in SQL Server?
- 30. SQL Server: aggiornamento colonna in un albero
Qual è il punto di 'DOVE 1 = 1'? – itsho
@itsho, se l'universo si rompe, Raj More non vuole perdere tempo a eseguire query di database. :) – user1172763
@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. –