Buscar texto dentro de procedimientos almacenados

Muchas veces hacemos uso de los procedimientos almacenados para realizar ciertas funciones sobre nuestra base de datos, desde operaciones de actualización, consulta, etc., hasta algunas actividades más complejas.

En ocaciones tenemos cientos o más de procedimientos almacenados y nunca falta un cambio sobre nuestra base de datos (por ejemplo, agregar una columna a una tabla) que nos obliga a revisar todos nuestros procedimientos para actualizarlos con el nuevo cambio. Cuando se tiene una documentación actualizada de la base de datos y por ende, de los procedimientos almacenados solo falta con echarle un vistazo para saber que procedimientos deben ser actualizados... pero muy raras veces - de hecho casi siempre ;) - no se cuenta con dicha documentación o no esta actualizada.

Cuando estamos ante esta situación podemos auxiliarnos con el siguiente código, el cual hace uso de syscomments (aquí se almacena el texto de los procedimientos almacenados, funciones, triggers, etc.) para realizar una búsqueda de un texto en específico dentro de todos los procedimientos y funciones de una base de datos especificada.


--La base de datos en la que se buscará
USE DBData
GO
--Variable que contentendrá el texto a buscar, nombre de una tabla, columna, etc...
DECLARE @SearchText AS VARCHAR(100)
SET @SearchText = 'Tabla1'
--Consulta de los procedimeintos que contienen dicho texto
SELECT DISTINCT USER_NAME(o.uid) + '.' + OBJECT_NAME(c.id) AS 'Object name',
CASE
WHEN OBJECTPROPERTY(c.id, 'IsReplProc') = 1
THEN 'Replication stored procedure'
WHEN OBJECTPROPERTY(c.id, 'IsExtendedProc') = 1
THEN 'Extended stored procedure'
WHEN OBJECTPROPERTY(c.id, 'IsProcedure') = 1
THEN 'Stored Procedure'
WHEN OBJECTPROPERTY(c.id, 'IsTrigger') = 1
THEN 'Trigger'
WHEN OBJECTPROPERTY(c.id, 'IsTableFunction') = 1
THEN 'Table-valued function'
WHEN OBJECTPROPERTY(c.id, 'IsScalarFunction') = 1
THEN 'Scalar-valued function'
WHEN OBJECTPROPERTY(c.id, 'IsInlineFunction') = 1
THEN 'Inline function'
WHEN OBJECTPROPERTY(c.id, 'IsView') = 1
THEN 'View'
END AS 'Object type'
FROM syscomments c
INNER JOIN
sysobjects o
ON c.id = o.id
WHERE c.text LIKE '%'+@SearchText+'%' AND
encrypted = 0 AND
( OBJECTPROPERTY(c.id, 'IsReplProc') = 1 OR
OBJECTPROPERTY(c.id, 'IsExtendedProc') = 1 OR
OBJECTPROPERTY(c.id, 'IsProcedure') = 1 OR
OBJECTPROPERTY(c.id, 'IsTrigger') = 1 OR
OBJECTPROPERTY(c.id, 'IsTableFunction') = 1 OR
OBJECTPROPERTY(c.id, 'IsScalarFunction') = 1 OR
OBJECTPROPERTY(c.id, 'IsInlineFunction') = 1 OR
OBJECTPROPERTY(c.id, 'IsView') = 1 )
ORDER BY [Object type], 'Object name'


De esta manera obtendremos el nombre de todos los procedimientos, funciones y triggers que dentro de sí contienen la palabra definida en @SearchText.

Esto me ha ayudado muchísimo en mi trabajo y espero que a alguien más le sirva.

Saludos y si tienen algún comentario para este o cualquier otro post en este blog no duden en escribirlo. :)

16 comentarios:

Anónimo dijo...

Genial esta query!!
Sos un genio!
Muuuchas gracias!!!

Anónimo dijo...

Genial! Con ideas como esta todo mucho más fácil ;)
Muchas gracias :D

Anónimo dijo...

Muchísimas gracias, me fue de gran ayuda :D

Anónimo dijo...

Que voy a decir, simplemnete OK!

Unknown dijo...

MUCHAS GRACIAS, BRO, ME AHORRASTE TIEMPO VALIOSO.

Deimos dijo...

Es una consulta con mucha utilidad, gracias.

Anónimo dijo...

Muy bien !!

Anónimo dijo...

Este query esta genial, mil gracias.

DXICAY dijo...

Gracias, me sirvio mucho...

Anónimo dijo...

Uyyyyyyy men me has salvado de ahorrarme un gran tiempo muchas gracias por tu aporte

Anónimo dijo...

genial!!, muchas gracias, me ha venido estupendamente tu query!.

renezito dijo...

Muchas gracias!
Sólo un detalle. Intenté buscar el texto "detalle_" y me arroja los SP donde existe la palabra "detalle" sin el guión bajo al final. Espero haberme explicado.

Axl10 dijo...

Muy buena script amigo, saca de apuros exactamente en la situación q planteas. Gracias por el aporte!

Anónimo dijo...

Gracias desde hace años utilizo tu pagina :D

Anónimo dijo...

Me sirvió, Muchas Gracias!

Anónimo dijo...

Excelente...muchas gracias.