Pregunta

Tengo una base de datos enorme con cientos de tablas y procedimientos almacenados.Usando SQL Server 2005, ¿cómo puedo obtener una lista de procedimientos almacenados que realizan una operación de inserción o actualización en una tabla determinada?

¿Fue útil?

Solución

select
  so.name,
  sc.text
from
  sysobjects so inner join syscomments sc on so.id = sc.id
where
  sc.text like '%INSERT INTO xyz%'
  or sc.text like '%UPDATE xyz%'

Esto le dará una lista de todos los contenidos de los procedimientos almacenados con INSERTAR o ACTUALIZAR para una tabla en particular (obviamente puede modificar la consulta para adaptarla).Además, los procedimientos más largos se dividirán en varias filas en el conjunto de registros devuelto, por lo que es posible que deba examinar un poco los resultados manualmente.

Editar:Consulta modificada para devolver también el nombre del SP.Además, tenga en cuenta que la consulta anterior devolverá las UDF y los SP.

Otros consejos

sys.sql_dependencies tiene una lista de entidades con dependencias, incluidas tablas y columnas que un sproc incluye en las consultas.Ver esta publicación para ver un ejemplo de una consulta que elimina las dependencias.El siguiente fragmento de código obtendrá una lista de dependencias de tablas/columnas por procedimiento almacenado

select sp.name       as sproc_name
      ,t.name        as table_name
      ,c.name        as column_name
 from sys.sql_dependencies d
 join sys.objects t
   on t.object_id = d.referenced_major_id
 join sys.objects sp
   on sp.object_id = d.object_id
 join sys.columns c
   on c.object_id = t.object_id
  and c.column_id = d.referenced_minor_id
where sp.type = 'P'

Utilice sys.dm_sql_referencing_entities

Tenga en cuenta que sp_depends está obsoleto.

Referencia de MSDN

Podría intentar exportar todos sus procedimientos almacenados a un archivo de texto y luego utilizar una búsqueda simple.

Una técnica más avanzada sería utilizar una búsqueda de expresiones regulares para encontrar todas las entradas SELECT FROM e INSERT FROM.

Esto parece funcionar:

select
so.name as [proc],
so2.name as [table],
sd.is_updated
from sysobjects so
inner join sys.sql_dependencies sd on so.id = sd.object_id
inner join sysobjects so2 on sd.referenced_major_id = so2.id
where so.xtype = 'p' -- procedure
and is_updated = 1 -- proc updates table, or at least, I think that's what this means

Si descarga sp_search_code del sitio web de Vyaskn, le permitirá encontrar cualquier texto dentro de los objetos de su base de datos.

http://vyaskn.tripod.com/sql_server_search_stored_procedure_code.htm

SELECT Distinct SO.Name
FROM sysobjects SO (NOLOCK)
INNER JOIN syscomments SC (NOLOCK) on SO.Id = SC.ID
AND SO.Type = 'P'
AND (SC.Text LIKE '%UPDATE%' OR SC.Text LIKE '%INSERT%')
ORDER BY SO.Name

Este enlace se utilizó como recurso para la búsqueda de SP.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top