Cómo identificar todos los procedimientos almacenados que hacen referencia a una tabla en particular

136

Creé una tabla sobre el entorno de desarrollo para fines de prueba y hay pocos sp's que están actualizando esta tabla. Ahora tengo que descartar esta tabla e identificar todos los sp que hacen referencia a esta tabla. Estoy enfrentando dificultades para encontrar la lista de todos los sp. Sugiera alguna consulta suponiendo que el nombre de la tabla es 'x' y que la base de datos es sql server 2005.

DJay
fuente

Respuestas:

259
SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%TableNameOrWhatever%'

Por cierto, aquí hay un recurso útil para este tipo de preguntas: Preguntas frecuentes sobre el catálogo del sistema del servidor SQL

Cadenas
fuente
3
¿Hay alguna razón para hacer esto sobre el acceso al ROUTINE_DEFINITIONencendido INFORMATION_SCHEMA.ROUTINES?
Marie
1
@Marie - SQL-Server 2005 (AFAIK) no tiene eso.
Cadenas
2
Pregunta, ¿esta solución encuentra objetos referenciados cuando están referenciados dentro de una cadena? como,set @Query = “SELECT * FROM Object_I_Need_To_Find_References…”;
Jeff.Clark
1
@ Jeff.Clark: hay una manera fácil de averiguarlo :-), pero sí, busca el texto del procedimiento directamente, por lo que lo encontraría.
Cadenas
2
sí, sí :) Me iba a tomar un tiempo configurar la prueba, y solo estaba buscando una respuesta fácil / perezosa :)
Jeff.Clark
27

Lo siguiente funciona en SQL2008 y superior. Proporciona una lista de procedimientos almacenados y funciones.

select distinct [Table Name] = o.Name, [Found In] = sp.Name, sp.type_desc
  from sys.objects o inner join sys.sql_expression_dependencies  sd on o.object_id = sd.referenced_id
                inner join sys.objects sp on sd.referencing_id = sp.object_id
                    and sp.type in ('P', 'FN')
  where o.name = 'YourTableName'
  order by sp.Name
Guy Hollington
fuente
1
OP necesita la respuesta para SQL-Server-2005
Chains
19

a veces las consultas anteriores no dan el resultado correcto, hay un procedimiento almacenado incorporado disponible para obtener las dependencias de la tabla como:

EXEC sp_depends @objname = N'TableName';
Pramod Pawar
fuente
1
Para mí, esto mostró desencadenantes y vistas, pero no procesos almacenados.
NealWalters
1
NOTA: Ejecuté esto en un sistema donde tenía acceso a tablas, pero no a Procs almacenados, por lo que, por supuesto, los Procs almacenados no aparecieron en el resultado.
NealWalters
18

Una forma sin consulta sería utilizar Sql Server Management Studio.

Localice la tabla, haga clic derecho y elija "Ver dependencias".

EDITAR

Pero, como dijeron los comentaristas, no es muy confiable.

Hans Kein
fuente
44
En 2005, la información de dependencias no es confiable si los objetos no se crean en el orden correcto.
Martin Smith
3
Como señaló @ Martin Smith, se creará un procedimiento almacenado que hace referencia a un objeto inexistente, aunque con una advertencia, pero no se colocará ninguna entrada en sysdepends. Además, lo mismo se aplica a los procedimientos almacenados que hacen referencia a una tabla en una base de datos externa: nunca se coloca ninguna entrada en sysdepends en ninguna de las bases de datos. Otra característica es que soltar / recrear una tabla o vista rompe la cadena de dependencia. Estas características ... err ... hacen que el seguimiento de dependencias de SQL Server sea prácticamente inútil.
Nicholas Carey
7

La siguiente consulta buscará todos los nombres de Procedimiento almacenado y la definición correspondiente de esos SP

select 
   so.name, 
   text 
from 
   sysobjects so, 
   syscomments sc 
where 
   so.id = sc.id 
   and UPPER(text) like '%<TABLE NAME>%'
Deepak Kothari
fuente
5
SELECT
    o.name
FROM
    sys.sql_modules sm
INNER JOIN sys.objects o ON
    o.object_id = sm.object_id
WHERE
    sm.definition LIKE '%<table name>%'

Solo tenga en cuenta que esto también activará los SP donde el nombre de la tabla está en los comentarios o donde el nombre de la tabla es una subcadena de otro nombre de tabla que se está utilizando. Por ejemplo, si tiene tablas llamadas "test" y "test_2" e intenta buscar SP con "test", obtendrá resultados para ambos.

Tom H
fuente
2
La consulta syscommentsde esta manera no es confiable para procedimientos largos, ya que divide la definición en fragmentos de 4000 caracteres en varias filas. sys.sql_modulesevita esto
Martin Smith
1
Buen punto. Lo he actualizado para usar sys.sql_modulesen su lugar.
Tom H
3
syscomments ha sido desacreditado en cada una de mis docenas de respuestas a la misma pregunta stackoverflow.com/…
gbn
5

La consulta a continuación solo funciona cuando se buscan dependencias en una tabla y no en las de una columna:

EXEC sp_depends @objname = N'TableName';

Sin embargo, la siguiente consulta es la mejor opción si desea buscar todo tipo de dependencias, no se pierde nada. En realidad, proporciona más información de la requerida.

 select distinct
        so.name
        --, text 
  from 
       sysobjects so, 
       syscomments sc 
  where 
     so.id = sc.id 
     and lower(text) like '%organizationtypeid%'
  order by so.name
Siraj Ansari
fuente
1
Para mí, no devolvió nada en SSMS 2014 que se ejecuta contra la base de datos en SQL Server 12.0)
NealWalters
3
SELECT DISTINCT OBJECT_NAME(OBJECT_ID),
object_definition(OBJECT_ID)
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%' + 'table_name' + '%'

GO

Esto funcionará si tiene que mencionar el nombre de la tabla.

ric
fuente
3

En Management Studio, puede hacer clic derecho en la tabla y hacer clic en 'Ver dependencias' ingrese la descripción de la imagen aquí

de lo que puede ver una lista de objetos que tienen dependencias con su tabla:ingrese la descripción de la imagen aquí

nzrytmn
fuente
1

Básicamente tienes 2 opciones:

----Opción 1

SELECT DISTINCT so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '%tablename%'

----Opcion 2

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

Estas 2 consultas le proporcionarán todos los procedimientos almacenados que hacen referencia a la tabla que desea. Esta consulta se basa en 2 tablas sys que son sysobjects y syscomments. El sysobjects es donde se almacenan todos los nombres de sus objetos DB, esto incluye los procedimientos almacenados.

Los comentarios del sistema contienen el texto de todos sus procedimientos.

Si consulta: SELECCIONE * DESDE syscomments

Tendrá una tabla que contiene la identificación, que es la asignación a la tabla de sysobjects con el texto contenido en los procedimientos almacenados como la última columna.

Alain Ghawi
fuente
0

Prueba esto

   SELECT DISTINCT so.name
    FROM syscomments sc
    INNER JOIN sysobjects so ON sc.id=so.id
    WHERE sc.TEXT LIKE '%your table name%'
Pooja Chavan
fuente