Buscar texto dentro de procedimientos, vistas y funciones

Señal o problema observado

Necesitamos saber dónde aparece el nombre de una tabla, una columna o una llamada concreta. Revisar manualmente cada procedimiento almacenado puede ocultar justo la referencia que explica un comportamiento.

Qué necesitamos distinguir

Una búsqueda textual localiza caracteres sin interpretar su función. Una dependencia, en cambio, registra que la definición de un objeto hace referencia a otro.

Esta es una búsqueda textual, no un análisis de dependencias. Puede encontrar una palabra en código, comentarios o cadenas. Su utilidad está en reducir el conjunto de objetos que después revisaremos con contexto.

Consulta

DECLARE @Texto NVARCHAR(200) = N'Producto';

SELECT
    s.name AS Esquema,
    o.name AS Objeto,
    o.type_desc AS Tipo,
    p.Posicion,
    SUBSTRING(
        m.definition,
        CASE WHEN p.Posicion > 120 THEN p.Posicion - 120 ELSE 1 END,
        500
    ) AS Fragmento
FROM sys.sql_modules AS m
INNER JOIN sys.objects AS o
    ON o.object_id = m.object_id
INNER JOIN sys.schemas AS s
    ON s.schema_id = o.schema_id
CROSS APPLY
(
    VALUES (CHARINDEX(@Texto, m.definition))
) AS p (Posicion)
WHERE o.type IN ('P', 'V', 'FN', 'IF', 'TF', 'TR')
  AND m.definition IS NOT NULL
  AND p.Posicion > 0
ORDER BY
    o.type_desc,
    s.name,
    o.name;

La consulta devuelve la primera posición encontrada y un fragmento cercano. Esto permite decidir qué objetos merecen una lectura completa sin llenar el resultado con definiciones extensas.

Parámetros o permisos

La intercalación es el conjunto de reglas que determina cómo se compara y ordena el texto. Un módulo cifrado conserva oculta su definición y puede devolver NULL, la marca de un valor ausente o desconocido.

Cambia @Texto por un identificador o fragmento reconocible. La comparación de CHARINDEX sigue la intercalación de la expresión. Si necesitas una comparación sensible a mayúsculas, puedes aplicar explícitamente una intercalación compatible con tu entorno.

La definición de un módulo cifrado aparece como NULL. También se necesita permiso para ver la definición correspondiente; tener permiso de ejecución no siempre implica poder leer su texto.

Cómo leer el resultado

Un alias es un nombre alternativo usado dentro de una consulta. SQL dinámico es código SQL construido durante la ejecución.

Tipo distingue procedimientos, vistas, funciones y disparadores. Fragmento aporta contexto suficiente para separar una referencia real de una coincidencia accidental.

Si buscas Producto, también puedes encontrar ProductoHistorico, un alias, un comentario o el texto de un mensaje. Abre la definición completa antes de concluir cómo se usa:

SELECT OBJECT_DEFINITION(OBJECT_ID(N'dbo.usp_ConsultarProducto'));

Una coincidencia dentro de SQL dinámico puede ser relevante aunque no aparezca en las dependencias normales. Al contrario, un nombre construido por concatenación quizá no contenga el texto completo que buscaste.

Qué conclusión sí permite obtener

Permite afirmar que el texto aparece en la definición visible de determinados módulos de la base actual. También ayuda a formar una lista inicial de objetos para inspección.

Qué conclusión todavía no permite obtener

No demuestra que el fragmento se ejecute, que corresponda al mismo objeto que investigas ni que la referencia sea válida. Puede estar en un comentario, una rama inalcanzable o una cadena construida para otra finalidad.

Un resultado vacío tampoco descarta SQL dinámico fragmentado, módulos cifrados, código de aplicación, jobs, paquetes externos u objetos sin visibilidad.

Siguiente comprobación razonable

Lee la definición completa de cada candidato y consulta las dependencias del objeto para comparar la coincidencia textual con las relaciones registradas. Si la referencia llega desde una aplicación, habrá que revisar también su código, configuración y llamadas ejecutadas.

Índice del recorrido

Desarrollo y exploración

22 artículos de Desarrollo y exploración
  1. 01Buscar una tabla o vista por nombre
  2. 02Buscar una columna en toda la base
  3. 03Buscar texto dentro de procedimientos, vistas y funciones
  4. 04Consultar dependencias de un objeto
  5. 05Listar relaciones y llaves foráneas
  6. 06Consultar llaves primarias, restricciones únicas e índices
  7. 07Listar columnas con tipo, longitud, nulabilidad y valor predeterminado
  8. 08Encontrar triggers y sus tablas asociadas
  9. 09Encontrar objetos modificados recientemente
  10. 10Obtener conteos aproximados de todas las tablas
  11. 11Medir el espacio utilizado por cada tabla
  12. 12Revisar columnas IDENTITY y su valor actual
  13. 13Detectar registros duplicados por una clave de negocio
  14. 14Detectar registros huérfanos
  15. 15Comparar dos conjuntos de datos
  16. 16Validar conversiones antes de modificar una columna
  17. 17Ejecutar un UPDATE con validación y reversión controlada
  18. 18Ejecutar un DELETE con respaldo lógico y reversión controlada
  19. 19Comparar la estructura de dos bases de datos
  20. 20Describir el resultado de una consulta o procedimiento
  21. 21Encontrar tablas sin llave primaria
  22. 22Buscar un valor en columnas seleccionadas