sql server - texto - ¿Cómo encuentro un procedimiento almacenado que contiene<text>?
procedimiento almacenado para mostrar datos (20)
Necesito buscar en un servidor SQL Server 2008 procedimientos almacenados que contengan el nombre de un campo de base de datos o el nombre de una variable.
¡Obtenga una copia de la herramienta gratuita de búsqueda de Red-Gate SQL y comience a disfrutar de la búsqueda en SQL Server! :-)
Es una herramienta excelente y muy útil, y ¡SÍ! Es totalmente GRATIS para cualquier tipo de uso.
Aquí está la versión de la unión que usa Losbear hecho, pero modificado 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
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 dada a continuación.
http://www.freshcodehub.com/Article/34/how-to-find-a-stored-procedure-containing-text-or-string
En caso de que necesites un esquema también:
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
Para cualquier servidor SQL más nuevo que el servidor SQL 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 el servidor SQL 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
También puede probar este programa de utilidad que escribí, es más eficiente usar una herramienta rápida que escribir una consulta SQL. También buscará sus archivos de código fuente.
Primero asegúrese de que está ejecutando la consulta bajo 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 ejecuta 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 usar 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)
Probé 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. Por favor, vea 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
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
También puede probar ApexSQL Search - complemento SSMS gratuito de ApexSQL.
Tomé la respuesta de Kashif y los uní a todos juntos. Curiosamente, a veces, encontré resultados en uno de los seleccionados pero no en el otro. Así que para estar seguro, corro 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
Yo uso este script. Si cambia sus Comentarios XML para mostrarlos como texto negro sobre un fondo amarillo, tendrá el efecto de resaltar el texto que está buscando en la columna xml de los resultados. (Herramientas -> Opciones -> Entorno -> Fuentes y colores [Mostrar elementos: 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 -----------------
---------------------------------------------
---------------------------------------------
SELECT * FROM sys.procedures WHERE Name LIKE ''%CompanySpecialisation%''
Esto es lo que escribí en SQL 2012 para seleccionar todos los procedimientos almacenados en los que un nombre como "CompanySpecialisation"
SELECT OBJECT_NAME(id)
FROM syscomments
WHERE [text] LIKE ''%Name%''
AND OBJECTPROPERTY(id, ''IsProcedure'') = 1
GROUP BY OBJECT_NAME(id)
Prueba esto .....
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%''
SELECT ROUTINE_NAME, ROUTINE_DEFINITION
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_DEFINITION LIKE ''%FieldName%''
AND ROUTINE_TYPE=''PROCEDURE''
SELECT name FROM sys.procedures WHERE Object_definition(object_id) LIKE ''%FOO%''
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 útil cuando se encuentran procedimientos que hacen referencia a una tabla / vista / procedimiento específico
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
select * from sys.system_objects
where name like ''%cdc%''
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.