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

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

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

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 compara la coincidencia textual con las dependencias registradas. Si la referencia llega desde una aplicación, revisa también su código, configuración y llamadas ejecutadas.