¿Cómo encuentro un procedimiento almacenado que contenga <texto>?

Respuestas:

557
SELECT ROUTINE_NAME, ROUTINE_DEFINITION
    FROM INFORMATION_SCHEMA.ROUTINES 
    WHERE ROUTINE_DEFINITION LIKE '%Foo%' 
    AND ROUTINE_TYPE='PROCEDURE'

SELECT OBJECT_NAME(id) 
    FROM SYSCOMMENTS 
    WHERE [text] LIKE '%Foo%' 
    AND OBJECTPROPERTY(id, 'IsProcedure') = 1 
    GROUP BY OBJECT_NAME(id)

SELECT OBJECT_NAME(object_id)
    FROM sys.sql_modules
    WHERE OBJECTPROPERTY(object_id, 'IsProcedure') = 1
    AND definition LIKE '%Foo%'
Kashif
fuente
61
Tenga en cuenta que la rutina_definición se recorta en 4000 caracteres en caso de que tenga un procedimiento largo. Utilice el método OBJECTPROPERTY en su lugar.
PeteT el
1
Según el plan de ejecución, la tercera variación parece ser la forma más eficaz de obtener estos datos.
TMcManemy
1
Un millón de veces lo que dijo @PeteT. Este límite de 4000 caracteres realmente me mordió hace unos años.
Vivian River
14
¿Puede agregar alguna explicación de lo que hacen cada una de las 3 consultas y cuál es la diferencia entre ellas?
Tot Zam
3
Sería bueno tener algunos detalles sobre lo que está haciendo cada consulta y cómo son diferentes o por qué una es mejor que la otra. Este tipo de respuestas fomentan el pegado a ciegas / copia por parte de ingenieros menos experimentados, y la frustración por los ingenieros más experimentados que trabajan con un nuevo RDBMS como SQL Server.
DavidScherer
78

¡Obtenga una copia de la herramienta gratuita Red-Gate SQL Search y comience a disfrutar de la búsqueda en SQL Server! :-)

ingrese la descripción de la imagen aquí

Es una herramienta excelente y muy útil, ¡y SÍ! Es totalmente, absolutamente GRATIS para cualquier tipo de uso.

marc_s
fuente
55
Esta es una herramienta excelente, que ya había estado usando antes de hacer esta pregunta. Vale la pena señalar que limita los resultados de búsqueda a 150 de forma predeterminada. Consulte esta publicación del foro para obtener información sobre cómo aumentar ese límite.
Scott
1
Es una herramienta súper rápida y utilizable.
Suat Atan PhD
Funciones limitadas pero herramienta asombrosa.
Aishwarya Shiva el
36

También puede probar ApexSQL Search : complemento SSMS gratuito de ApexSQL.

ingrese la descripción de la imagen aquí

David Smithers
fuente
32

Tomé la respuesta de Kashif y los uní a todos. Curiosamente, a veces, encontré resultados en una de las selecciones pero no en la otra. Entonces, para estar seguro, ejecuto los 3 cuando estoy buscando algo. Espero que esto ayude:

DECLARE @SearchText varchar(1000) = 'mytext';

SELECT DISTINCT SPName 
FROM (
    (SELECT ROUTINE_NAME SPName
        FROM INFORMATION_SCHEMA.ROUTINES 
        WHERE ROUTINE_DEFINITION LIKE '%' + @SearchText + '%' 
        AND ROUTINE_TYPE='PROCEDURE')
    UNION ALL
    (SELECT OBJECT_NAME(id) SPName
        FROM SYSCOMMENTS 
        WHERE [text] LIKE '%' + @SearchText + '%' 
        AND OBJECTPROPERTY(id, 'IsProcedure') = 1 
        GROUP BY OBJECT_NAME(id))
    UNION ALL
    (SELECT OBJECT_NAME(object_id) SPName
        FROM sys.sql_modules
        WHERE OBJECTPROPERTY(object_id, 'IsProcedure') = 1
        AND definition LIKE '%' + @SearchText + '%')
) AS T
ORDER BY T.SPName
Losbear
fuente
12

En caso de que también necesitaras un esquema:

SELECT   DISTINCT SCHEMA_NAME(o.schema_id),o.name,[text]
FROM     syscomments AS c
         INNER JOIN sys.objects AS o ON c.id = o.[object_id]
         INNER JOIN sys.schemas AS s ON o.schema_id = s.schema_id
WHERE    text LIKE '%foo%'
ORDER BY  SCHEMA_NAME(o.schema_id),o.name 
Tom
fuente
10
SELECT ROUTINE_NAME, ROUTINE_DEFINITION 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_DEFINITION LIKE '%FieldName%' 
AND ROUTINE_TYPE='PROCEDURE'
Gary Kindel
fuente
2
Sin embargo, tenga cuidado con esto, ya que es solo una coincidencia de subcadena. "FieldName" puede aparecer en un comentario, o en una constante de cadena, o algo así. Además, dudo que la búsqueda [whatever]se capture whatever(se vuelve más importante cuando busca identificadores calificados para el esquema).
un CVn
2
Vea el comentario de @ PeteT en la respuesta aceptada, arriba. INFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITION se recorta en 4000 caracteres. Como tal, este método no funcionará si ha almacenado procedimientos de más de 4000 caracteres.
TMcManemy
7

Intenté el ejemplo anterior pero no mostraba más de 4000 caracteres, luego lo modifiqué un poco y pude obtener la definición completa del procedimiento almacenado. Consulte el script actualizado a continuación:

SELECT SCHEMA_NAME(O.SCHEMA_ID) [SCHEMA_NAME], O.NAME, OBJECT_DEFINITION(OBJECT_ID) TEXT
FROM   SYSCOMMENTS AS C
       INNER JOIN SYS.OBJECTS AS O ON C.ID = O.[OBJECT_ID]
       INNER JOIN SYS.SCHEMAS AS S ON O.SCHEMA_ID = S.SCHEMA_ID
WHERE  OBJECT_DEFINITION(OBJECT_ID) LIKE '%FOO%'
ORDER BY  SCHEMA_NAME(O.SCHEMA_ID), O.NAME
Arenoso
fuente
6

Primero asegúrese de ejecutar la consulta con sus credenciales de usuario y también en el contexto de base de datos correcto.

USE YOUR_DATABASE_NAME;

De lo contrario, sys.procedures no devolverá nada. Ahora ejecute la consulta de la siguiente manera:

select * from sys.procedures p 
join sys.syscomments s on p.object_id = s.id 
where text like '%YOUR_TEXT%';

Otra opción es utilizar INFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITION, pero tenga en cuenta que solo contiene un número limitado de caracteres (es decir, los primeros 4000 caracteres) de la rutina.

select * from YOUR_DATABASE_NAME.INFORMATION_SCHEMA.ROUTINES
where ROUTINE_DEFINITION like '%YOUR_TEXT%';

Probé en Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)

Yuci
fuente
3
select * from sys.system_objects
where name like '%cdc%'
Channdeep Singh
fuente
2

Aquí está la versión de unión que usa Losbear, pero modificada para que también muestre el nombre del esquema:

DECLARE @SearchText varchar(1000) = 'searchtext';

SELECT DISTINCT sc.SPECIFIC_SCHEMA as 'Schema', sp.SPName as 'Name'
FROM (
    (SELECT ROUTINE_NAME SPName
        FROM INFORMATION_SCHEMA.ROUTINES 
        WHERE ROUTINE_DEFINITION LIKE '%' + @SearchText + '%' 
        AND ROUTINE_TYPE='PROCEDURE')
    UNION ALL
    (SELECT OBJECT_NAME(id) SPName
        FROM SYSCOMMENTS 
        WHERE [text] LIKE '%' + @SearchText + '%' 
        AND OBJECTPROPERTY(id, 'IsProcedure') = 1 
        GROUP BY OBJECT_NAME(id))
    UNION ALL
    (SELECT OBJECT_NAME(object_id) SPName
        FROM sys.sql_modules
        WHERE OBJECTPROPERTY(object_id, 'IsProcedure') = 1
        AND definition LIKE '%' + @SearchText + '%')
) AS sp
CROSS APPLY (select SPECIFIC_SCHEMA from INFORMATION_SCHEMA.ROUTINES r where r.ROUTINE_NAME = sp.SPName) sc
ORDER BY 1
Alejandro
fuente
2

Cómo encontrar un procedimiento almacenado que contenga texto o cadena

Muchas veces necesitamos encontrar el texto o la cadena en el procedimiento almacenado. Aquí está la consulta para encontrar el texto que contiene.

SELECT OBJECT_NAME(id) 
FROM SYSCOMMENTS 
WHERE [text] LIKE '%Text%' 
AND OBJECTPROPERTY(id, 'IsProcedure') = 1 
GROUP BY OBJECT_NAME(id)

Para obtener más información, consulte la URL que se proporciona a continuación.

http://www.freshcodehub.com/Article/34/how-to-find-a-stored-procedure-containing-text-or-string

Kamal Pratap
fuente
2

Para cualquier servidor SQL más nuevo que SQL Server 2000:

SELECT object_name = OBJECT_NAME(sm.object_id), o.type_desc, sm.definition  
FROM sys.sql_modules AS sm  
JOIN sys.objects AS o ON sm.object_id = o.object_id  
WHERE sm.definition like '%searchString%'  
ORDER BY  o.type, o.name, o.object_id

Si alguien está atascado con SQL Server 2000, la tabla sql_modules no existe, por lo que usaría syscomments, obtendrá múltiples registros para procedimientos almacenados de más de 4000 caracteres, pero tendrán el mismo campo c.number para que pueda agrupar las partes juntas para obtener el texto completo del procedimiento almacenado:

    Select o.id, c.number, o.name, c.text  
    from syscomments c 
    inner join sysobjects o on o.id = c.id 
    where c.encrypted = 0 and o.type = 'P'  
      and c.id in  
     (Select id from syscomments where text like '%searchtext%')
    order by objecttype, o.name, o.id, c.number, c.colid        
Mourad
fuente
1
SELECT name FROM sys.procedures WHERE Object_definition(object_id) LIKE '%FOO%'
Jitendra Sawant
fuente
¿También recorta el proceso almacenado a 4000 caracteres?
Przemyslaw Remin
1
create Procedure [dbo].[TextFinder]
(@Text varchar(500),@Type varchar(2)=NULL) 
AS
BEGIN



SELECT DISTINCT o.name AS ObjectName,
CASE o.xtype

WHEN 'C' THEN 'CHECK constraint'

WHEN 'D' THEN 'Default or DEFAULT constraint'

WHEN 'F' THEN 'FOREIGN KEY constraint'

WHEN 'FN' THEN 'Scalar function'

WHEN 'IF' THEN 'In-lined table-function'

WHEN 'K' THEN 'PRIMARY KEY or UNIQUE constraint'

WHEN 'L' THEN 'Log'

WHEN 'P' THEN 'Stored procedure'

WHEN 'R' THEN 'Rule'

WHEN 'RF' THEN 'Replication filter stored procedure'

WHEN 'S' THEN 'System table'

WHEN 'TF' THEN 'Table function'

WHEN 'TR' THEN 'Trigger'`enter code here`

WHEN 'U' THEN 'User table'

WHEN 'V' THEN 'View'

WHEN 'X' THEN 'Extended stored procedure'

ELSE o.xtype

END AS ObjectType,

ISNULL( p.Name, '[db]') AS Location

FROM syscomments c

INNER JOIN sysobjects o ON c.id=o.id

LEFT JOIN sysobjects p ON o.Parent_obj=p.id

WHERE c.text LIKE '%' + @Text + '%' and

o.xtype = case when @Type IS NULL then o.xtype  else @Type end

ORDER BY Location, ObjectName

END
dinesh
fuente
0
SELECT s.name + '.' + o.name ProcedureName
, c.text ProcedureSteps
FROM   sys.syscomments c 
INNER JOIN
sys.objects o 
ON 
c.id = o.object_id
INNER JOIN
sys.schemas s 
ON 
o.schema_id = s.schema_id
WHERE  o.type = 'P'
AND c.text LIKE N'%XXXX%'
ORDER BY s.name + '.' + o.name
, c.colid

Esta consulta devuelve el nombre y el contenido de cualquier procedimiento almacenado donde se hace referencia a "XXXX" dentro del procedimiento almacenado.

Esto es bastante útil cuando se encuentran procedimientos que hacen referencia a una tabla / vista / procedimiento específico

usuario2132692
fuente
0
SELECT * FROM sys.procedures WHERE Name LIKE '%CompanySpecialisation%'

Esto es lo que he escrito en SQL 2012 para seleccionar todos los procedimientos almacenados donde el nombre como "Especialización de la empresa"

Tapan kumar
fuente
0

Procedimiento almacenado para buscar texto en SP .. {Dinesh Baskaran} Trendy Global Systems pvt ltd

  create Procedure [dbo].[TextFinder]
 (@Text varchar(500),@Type varchar(2)=NULL)
AS
BEGIN





SELECT DISTINCT o.name AS ObjectName, 
CASE o.xtype 
WHEN 'C' THEN 'CHECK constraint ' 
WHEN 'D' THEN 'Default or DEFAULT constraint'
WHEN 'F' THEN 'FOREIGN KEY constraint'
WHEN 'FN' THEN 'Scalar function'
WHEN 'IF' THEN 'In-lined table-function'
WHEN 'K' THEN 'PRIMARY KEY or UNIQUE constraint'
WHEN 'L' THEN 'Log'
WHEN 'P' THEN 'Stored procedure'
WHEN 'R' THEN 'Rule'
WHEN 'RF' THEN 'Replication filter stored procedure' 
WHEN 'S' THEN 'System table'  
WHEN 'TF' THEN 'Table function' 
WHEN 'TR' THEN 'Trigger'  
WHEN 'U' THEN 'User table' 
WHEN 'V' THEN 'View' 
WHEN 'X' THEN 'Extended stored procedure' 
ELSE o.xtype 
END AS ObjectType,  

ISNULL( p.Name, '[db]') AS Location

FROM syscomments c

INNER JOIN sysobjects o ON c.id=o.id

LEFT JOIN sysobjects p ON o.Parent_obj=p.id

WHERE c.text LIKE '%' + @Text + '%' and

o.xtype = case when @Type IS NULL then o.xtype  else @Type end 


ORDER BY Location, ObjectName



END
dinesh baskaran
fuente
0
SELECT OBJECT_NAME(id)     
FROM syscomments 
WHERE [text] LIKE '%Name%' 
AND OBJECTPROPERTY(id, 'IsProcedure') = 1 
GROUP BY OBJECT_NAME(id)

Prueba esto .....

Er Ketan Vavadiya
fuente
0
sp_msforeachdb 'use ?;select name,''?'' from sys.procedures where object_definition(object_id) like ''%text%'''

Esto buscará en todos los procedimientos almacenados de todas las bases de datos. Esto también funcionará para procedimientos largos.

Akshey Bhat
fuente
0

Yo uso este script. Si cambia sus comentarios XML para que se muestren como texto negro sobre un fondo amarillo, obtendrá el efecto de resaltar el texto que está buscando en la columna xml de los resultados. (Herramientas -> Opciones -> Entorno -> Fuentes y colores [Elementos de visualización: Comentario XML]

    ---------------------------------------------
    --------------   Start  FINDTEXT   ----------
    ---------------------------------------------

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 
    SET NOCOUNT ON
    GO
    DECLARE @SearchString VARCHAR(MAX) 
    SET @SearchString = 'the text you''re looking for'
    DECLARE @OverrideSearchStringWith VARCHAR(MAX) 
    --#############################################################################
    -- Use Escape chars in Brackets []  like [%] to find percent char.
    --############################################################################# 

    DECLARE @ReturnLen INT 
    SET @ReturnLen = 50;
    with    lastrun
              as (select    DEPS.OBJECT_ID
                           ,MAX(last_execution_time) as LastRun
                  from      sys.dm_exec_procedure_stats DEPS
                  group by  deps.object_id
                 )
        SELECT  OL.Type
               ,OBJECT_NAME(OL.Obj_ID) AS 'Name'
               ,LTRIM(RTRIM(REPLACE(SUBSTRING(REPLACE(OBJECT_DEFINITION(OL.Obj_ID), NCHAR(0x001F), ''), CHARINDEX(@SearchString, OBJECT_DEFINITION(OL.Obj_ID)) - @ReturnLen, @ReturnLen * 2), @SearchString, '   ***-->>' + @SearchString + '<<--***  '))) AS SourceLine
               ,CAST(REPLACE(REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(MAX), REPLACE(OBJECT_DEFINITION(OL.Obj_ID), NCHAR(0x001F), '')), '&', '(A M P)'), '<', '(L T)'), '>', '(G T)'), @SearchString, '<!-->' + @SearchString + '<-->') AS XML) AS 'Hilight Search'
               ,(SELECT [processing-instruction(A)] = REPLACE(OBJECT_DEFINITION(OL.Obj_ID), NCHAR(0x001F), '')
                FOR
                 XML PATH('')
                    ,TYPE
                ) AS 'code'
               ,Modded AS Modified
               ,LastRun as LastRun
        FROM    (SELECT CASE P.type
                          WHEN 'P' THEN 'Proc'
                          WHEN 'V' THEN 'View'
                          WHEN 'TR' THEN 'Trig'
                          ELSE 'Func'
                        END AS 'Type'
                       ,P.OBJECT_ID AS OBJ_id
                       ,P.modify_Date AS modded
                       ,LastRun.LastRun
                 FROM   sys.Objects P WITH (NOLOCK)
                        LEFT join lastrun on P.object_id = lastrun.object_id
                 WHERE  OBJECT_DEFINITION(p.OBJECT_ID) LIKE '%' + @SearchString + '%'
                        AND type IN ('P', 'V', 'TR', 'FN', 'IF', 'TF')
                     --   AND lastrun.LastRun  IS NOT null
                ) OL
    OPTION  (FAST 10)

    ---------------------------------------------
    ----------------    END     -----------------
    ---------------------------------------------
    ---------------------------------------------
Jay Wheeler
fuente