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
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')
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
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]='????'
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.
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 '' ' –
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. Buscar todas las referencias a un objeto en una base de datos SQL Server
- 2. Buscar tabla bloqueada en SQL Server
- 3. SQL Server 2008 consulta de tabla cruzada
- 4. Unir base de datos cruzada en sqlalchemy
- 5. ¿Puedo guardar un 'Objeto' en una base de datos de SQL Server?
- 6. Referencia cruzada en varias bases de datos
- 7. texto de SQL Server Buscar comercial (&)
- 8. Base de datos SQL Azure usando SQL Server Management Studio
- 9. ¿Cómo crear un proyecto de base de datos desde una base de datos SQL Server existente?
- 10. Traer la base de datos de SQL Server en línea
- 11. Generando un script SQL de datos de mi base de datos (SQL SERVER)
- 12. Cómo tratar con un objeto de valor que necesita buscar datos en la base de datos
- 13. Sincronización entre la base de datos SQL Lite en un dispositivo android y la base de datos SQL Server
- 14. Buscar todas las columnas de un cierto tipo en todas las tablas en una base de datos SQL Server
- 15. SQL - buscar base de datos con el operador LIKE
- 16. ¿Cómo creo una base de datos programáticamente en SQL Server?
- 17. Base de datos SQL Server 2005 'En recuperación'
- 18. Crear una base de datos mediante programación en SQL Server
- 19. Múltiples idiomas en una base de datos - SQL Server 2005
- 20. Encontrar un ensamblado de SQL DLL con solo la base de datos en SQL Server
- 21. Buscar objetos rotos en SQL Server
- 22. Administrador de base de datos de SQL Server gratis
- 23. Base de datos de secuencias de comandos SQL-Server
- 24. Restaurar la base de datos de SQL Server 2008 a SQL Server 2000
- 25. ¿Cómo convertir la base de datos de SQL Server 2008 R2 a SQL Server 2012?
- 26. Base de datos predeterminada de SQL Server cuando Query - master
- 27. ¿Cómo escucho de base de datos SQL Server cambia
- 28. ¿Quitar usuario de la base de datos de SQL Server?
- 29. copiar una base de datos dentro de SQL Server Express?
- 30. Migraciones de base de datos para SQL Server
¿Cuál es el punto de 'WHERE 1 = 1'? – itsho
@itsho, si el universo se rompe, Raj More no quiere perder tiempo ejecutando consultas de bases de datos. :) – user1172763
@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. –