2010-09-09 14 views
17

Estoy tratando de encontrar todas las referencias a un objeto en una base de datos SQL Server.Buscar todas las referencias a un objeto en una base de datos SQL Server

¿Cómo puedo buscar rápidamente? SQL Server Management Studio no parece hacerlo. Yo uso http://www.red-gate.com/products/SQL_Search/ pero me gustaría encontrar la solución "oficial" de Microsoft para esto. ¿Está en otro producto?

Por ejemplo, cuando hago una búsqueda masiva en Visual Studio, me gustaría poder encontrar algo en todos los procedimientos almacenados.

O tal vez no estoy codificando esto de la manera correcta?

Carl

Respuesta

0

No estoy seguro de manera 'oficial de Microsoft', pero yo he utilizado SqlDigger en el pasado. No está mal.

Si desea hacerlo en VS, necesitará el texto de todos sus procs incluidos en su proyecto.

+0

Este enlace está muerto. Muchos sitios ofrecen una descarga de esta herramienta, pero no veo una oficial. Por lo general, solo uso el complemento gratuito SQL Search de RedGate (http://www.red-gate.com/products/sql-development/sql-search/). – Brian

1

que utilizar esta consulta para buscar todas las tablas (o texto) en los procedimientos almacenados:

SELECT DISTINCT o.name, o.xtype 
FROM syscomments c 
INNER JOIN sysobjects o ON c.id=o.id 
WHERE c.TEXT LIKE '%tablename%' 
+2

Consulte mi respuesta para saber por qué debería comprobar 'SYS.SQL_MODULES' en su lugar. –

37

Uso:

select object_name(m.object_id), m.* 
    from sys.sql_modules m 
where m.definition like N'%name_of_object%' 

... porque SYSCOMMENTS y INFORMATION_SCHEMA.routines tienen nvarchar (4000) columnas Entonces, si se usa "name_of_object" en la posición 3998, no se encontrará. SYSCOMMENTS tiene varias líneas, pero INFORMATION_SCHEMA.routines trunca.

+1

Gracias ... ¡aunque me hubiera gustado que me lo hubieras dicho hace un par de semanas! – Martin

+0

@MArtin la pregunta solo se hizo hace 20 horas ... –

+0

sys.sql_modules no está disponible en SQL Server 2000 sin embargo. – DeanOC

-2

En SQL 2000 aquí hay una consulta que puede realizar búsquedas dentro de las definiciones de objetos, y admite cadenas de búsqueda de hasta 2000 caracteres. Utiliza los fragmentos en la tabla syscomments.

SELECT O.name, O.xtype 
FROM sysobjects O 
WHERE EXISTS (
    SELECT * 
    FROM 
     (
     SELECT 
      Chunk = Substring(C1.text, T.Offset, 4000) 
       + Coalesce(Substring(C2.text, 1, T.AdditionalLength), '') 
     FROM 
      syscomments C1 
      CROSS JOIN (
       SELECT 1, 0 
       UNION ALL 
       SELECT 2001, 2000 
      ) T (Offset, AdditionalLength) 
      LEFT JOIN syscomments C2 
       ON C1.id = C2.id 
       AND C1.colid + 1 = C2.colid 
       AND T.Offset > 1 
     WHERE 
      O.id = C1.id 
    ) C 
    WHERE 
     Chunk LIKE '%search string%' 
); 
+0

¿Qué no le gusta de esta respuesta?!?! – ErikE

0

SQL Server Management Studio tiene una función Ver dependencias al hacer clic derecho sobre un objeto en el Explorador de objetos. Es esto lo que estás buscando?

+0

View Dependencies no le indicará dónde se encuentra un objeto, p. Ej. una tabla o vista, se hace referencia en SQL dinámico. La consulta proporcionada por OMG Ponies lo hará. – DeanOC

1

Si quiere utilizar OMG Ponies sql como un atajo de teclado en SSMS, agregue el siguiente SP a su db maestro.

USE [master] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE PROCEDURE [dbo].[SP_FindAllReferences] 
@targetText nvarchar(128) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    declare @origdb nvarchar(128) 
    select @origdb = db_name() 

    declare @sql nvarchar(1000) 

    set @sql = 'USE [' + @origdb +'];' 
    set @sql += 'select object_name(m.object_id), m.* ' 
    set @sql += 'from sys.sql_modules m where m.definition like N' + CHAR(39) + '%' + @targetText + '%' + CHAR(39) 

    exec (@sql) 

    SET NOCOUNT OFF; 
END 

continuación, sólo tiene que añadir dbo.SP_FindAllReferences a los atajos de teclado y entonces usted puede utilizar en el contexto de cualquier base de datos en el servidor.

¡Salud!

Nota: Si está utilizando SQL Server 2005, usted tendrá que reemplazar

@sql += 

con

@sql = @sql + 
1

Con el uso de un SQL indocumentado sp: sp_msforeachdb

exec sp_msforeachdb ' 
USE [?]; 

--IF DB_NAME() NOT IN (''master'',''tempdb'',''model'',''msdb'') 
BEGIN 
DECLARE 
    @SearchStr varchar(100) 
    SET @SearchStr = ''%column_store_segments%''; 
SELECT DISTINCT 
    ''?'' as db_name, o.name 
    , (CASE upper(o.xtype) 
      WHEN ''C'' THEN ''CHECK constraint''   
      WHEN ''D'' THEN ''Default or DEFAULT constraint''      
      WHEN ''F'' THEN ''FOREIGN KEY constraint'' 
      WHEN ''L'' THEN ''Log''                 
      WHEN ''FN'' THEN ''Scalar function''   
      WHEN ''IF'' THEN ''Inline table-function'' 
      WHEN ''PK'' THEN ''PRIMARY KEY or UNIQUE constraint'' 
      WHEN ''P'' THEN ''Stored procedure''            
      WHEN ''R'' THEN ''Rule''      
      WHEN ''RF'' THEN ''Replication filter stored procedure''    
      WHEN ''S'' THEN ''System table''    
      WHEN ''TF'' THEN ''Table function'' 
      WHEN ''TR'' THEN ''Trigger''     
      WHEN ''U'' THEN ''User table''  
      WHEN ''V'' THEN ''View''      
      WHEN ''UQ'' THEN ''UNIQUE constraint (type is K)''     
      WHEN ''X'' THEN ''Extended stored procedure''       
     ELSE upper(o.xtype) END) Type 
    , (CASE upper(o.xtype) 
      WHEN ''PK'' THEN (select object_name(parent_object_id) FROM sys.key_constraints (nolock) WHERE o.name=name) 
      WHEN ''F'' THEN (select object_name(parent_object_id) FROM sys.foreign_keys (nolock) WHERE o.name=name) 
      WHEN ''TR'' THEN (select object_name(parent_id) FROM sys.triggers (nolock) WHERE o.name=name)  
     ELSE '''' END) as Parent_Object 
FROM sysobjects o (nolock) 
INNER JOIN syscomments sc (nolock) ON o.id = sc.id 
WHERE UPPER(text) LIKE UPPER(@SearchStr) AND substring(o.name,1,3)<> ''dt_'' 
GROUP BY o.name, o.xtype 
END' 
GO 
+0

Me encanta esto. ¡Gracias! – Jason

1

Encontré una solución como esta ...

USE [Database] 
GO 

SELECT 
referencing_schema_name = SCHEMA_NAME(o.SCHEMA_ID), 
referencing_object_name = o.name, 
referencing_object_type_desc = o.type_desc, 
referenced_schema_name, 
referenced_object_name = referenced_entity_name, 
referenced_object_type_desc = o1.type_desc, 
referenced_server_name, referenced_database_name 
--,sed.* -- Uncomment for all the columns 
FROM 
sys.sql_expression_dependencies sed 
INNER JOIN 
sys.objects o ON sed.referencing_id = o.[object_id] 
LEFT OUTER JOIN 
sys.objects o1 ON sed.referenced_id = o1.[object_id] 
WHERE 
referenced_entity_name = 'SP_Pay_GetData' 
order by referencing_object_name 

http://blog.sqlauthority.com/2012/12/02/sql-server-find-referenced-or-referencing-object-in-sql-server-using-sys-sql_expression_dependencies/

Cuestiones relacionadas