如何find包含<text>的存储过程?

我需要searchSQL Server 2008中的存储过程,其中包含可能的数据库字段名称或variables名称。

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%' 

抓住免费 的红门SQLsearch工具的副本,并开始享受在SQL Serversearch! 🙂

在这里输入图像描述

这是一个非常有用的工具, YES! 这是完全免费的任何使用。

您也可以尝试ApexSQL Search – 免费的ApexSQL SSMS插件。

在这里输入图像描述

我拿了卡西夫的答案,把他们联合起来。 奇怪的是,有时候,我在其中一个select中find了结果,而另一个却没有。 所以为了安全起见,我在找东西的时候全部跑完了3个。 希望这可以帮助:

 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 
 SELECT ROUTINE_NAME, ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_DEFINITION LIKE '%FieldName%' AND ROUTINE_TYPE='PROCEDURE' 

如果您还需要架构:

 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 

我试过上面的例子,但它没有显示超过4000个字符,然后我修改了一点点,并能够得到整个存储过程的定义。 请参阅下面的更新脚本 –

 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 

首先确保您在用户凭据下运行查询,并在正确的数据库上下文中运行该查询。

 USE YOUR_DATABASE_NAME; 

否则,sys.procedures将不会返回任何东西。 现在运行查询如下:

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

另一个select是使用INFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITION,但要注意,它只保存例程的有限数量的字符(即前4000个字符)。

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

我testing了Microsoft SQL Server 2008 R2(SP1) – 10.50.2500.0(X64)

 select * from sys.system_objects where name like '%cdc%' 
 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.procedures WHERE Name LIKE '%CompanySpecialisation%' 

这是我在SQL 2012中编写的select所有存储过程的名称,如“CompanySpecialisation”

 SELECT name FROM sys.procedures WHERE Object_definition(object_id) LIKE '%FOO%' 

在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 
 SELECT OBJECT_NAME(id) FROM syscomments WHERE [text] LIKE '%Name%' AND OBJECTPROPERTY(id, 'IsProcedure') = 1 GROUP BY OBJECT_NAME(id) 

尝试这个 …..

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

这将search所有数据库的所有存储过程。 这也适用于长时间的程序。

我使用这个脚本。 如果将XML注释更改为在黄色背景上显示为黑色文本,则可以在结果的xml列中突出显示要查找的文本。 (工具 – >选项 – >环境 – >字体和颜色[Display items:XML Comment]

  --------------------------------------------- -------------- 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), '')), '&', '(AMP)'), '<', '(LT)'), '>', '(GT)'), @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 ----------------- --------------------------------------------- --------------------------------------------- 

以下是使用Losbear制作的联合版本,但进行了修改,以便输出模式名称:

 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 

如何查找包含文本或string的存储过程

很多时候我们需要在存储过程中find文本或string。 这里是查询包含的文本。

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

欲了解更多信息,请查看下面给出的给定的URL。

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

 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 

此查询返回在存储过程中引用“XXXX”的任何存储过程的名称和内容。

当find引用特定表/视图/过程的过程时,这是退出有用的