在SQL Server中搜索存储过程中的文本

Dha*_*tel 750 sql sql-server stored-procedures

我想从我的所有数据库存储过程中搜索文本.我使用下面的SQL:

SELECT DISTINCT
       o.name AS Object_Name,
       o.type_desc
  FROM sys.sql_modules m
       INNER JOIN
       sys.objects o
         ON m.object_id = o.object_id
 WHERE m.definition Like '%[ABD]%';
Run Code Online (Sandbox Code Playgroud)

我想[ABD]在所有存储过程中搜索包括方括号,但它没有给出正确的结果.如何更改查询以实现此目的?

Mah*_*mal 536

逃避方括号:

...
WHERE m.definition Like '%\[ABD\]%' ESCAPE '\'
Run Code Online (Sandbox Code Playgroud)

然后方括号将被视为字符串文字而不是通配符.

  • 这不适用于较长的存储过程.请改用下面的Ullas SQL. (5认同)
  • @Imad您可以通过将`SCHEMA_NAME(o.schema_id)AS Schema_Name`添加到select子句来获取模式名称. (3认同)
  • 我发现这个答案只会搜索存储过程文本的前4000个字符.查看此链接以获得真实答案.http://sqlhints.com/2011/10/01/how-to-find-all-the-stored-procedures-having-a-given-text-in-it/ (3认同)

小智 301

试试这个请求:

询问

SELECT name
FROM   sys.procedures
WHERE  Object_definition(object_id) LIKE '%strHell%'
Run Code Online (Sandbox Code Playgroud)

  • 我必须以管理员身份运行这项工作。 (3认同)
  • 此选项有 4000 个字符的限制吗? (2认同)

Dav*_*ers 55

您是否尝试过使用某些第三方工具进行搜索?有几个是免费的,过去我节省了很多时间.

下面是我使用的两个SSMS Addins,取得了很好的成功.

ApexSQL搜索 - 搜索数据库中的模式和数据,并具有其他功能,如依赖性跟踪等...

SSMS工具包 - 具有与前一个相同的搜索功能和其他一些很酷的功能.SQL Server 2012不是免费的,但仍然非常实惠.

我知道这个答案并不是100%与问题相关(更具体),但希望其他人会发现这个问题很有用.


Dan*_*ley 33

我通常运行以下操作来实现:

select distinct object_name(id) 
from syscomments 
where text like '%[ABD]%'
order by object_name(id) 
Run Code Online (Sandbox Code Playgroud)


ped*_*ram 23

使用SQL Server的好习惯.

制作以下商店程序并为底部图像设置短按键,

CREATE PROCEDURE [dbo].[Searchinall]       
(@strFind AS VARCHAR(MAX))
AS
BEGIN
    SET NOCOUNT ON; 
    --TO FIND STRING IN ALL PROCEDURES        
    BEGIN
        SELECT OBJECT_NAME(OBJECT_ID) SP_Name
              ,OBJECT_DEFINITION(OBJECT_ID) SP_Definition
        FROM   sys.procedures
        WHERE  OBJECT_DEFINITION(OBJECT_ID) LIKE '%'+@strFind+'%'
    END 

    --TO FIND STRING IN ALL VIEWS        
    BEGIN
        SELECT OBJECT_NAME(OBJECT_ID) View_Name
              ,OBJECT_DEFINITION(OBJECT_ID) View_Definition
        FROM   sys.views
        WHERE  OBJECT_DEFINITION(OBJECT_ID) LIKE '%'+@strFind+'%'
    END 

    --TO FIND STRING IN ALL FUNCTION        
    BEGIN
        SELECT ROUTINE_NAME           Function_Name
              ,ROUTINE_DEFINITION     Function_definition
        FROM   INFORMATION_SCHEMA.ROUTINES
        WHERE  ROUTINE_DEFINITION LIKE '%'+@strFind+'%'
               AND ROUTINE_TYPE = 'FUNCTION'
        ORDER BY
               ROUTINE_NAME
    END

    --TO FIND STRING IN ALL TABLES OF DATABASE.    
    BEGIN
        SELECT t.name      AS Table_Name
              ,c.name      AS COLUMN_NAME
        FROM   sys.tables  AS t
               INNER JOIN sys.columns c
                    ON  t.OBJECT_ID = c.OBJECT_ID
        WHERE  c.name LIKE '%'+@strFind+'%'
        ORDER BY
               Table_Name
    END
END
Run Code Online (Sandbox Code Playgroud)

现在 - 设置如下所示的快捷键,

在此输入图像描述

只要你想找到任何类似的四个对象的特定文本,以便下一次Store procedure,Views,FunctionsTables.您只需要编写该关键字并按下快捷键即可.

例如:我想搜索'PaymentTable'然后在查询编辑器中写'PaymentTable'并按下快捷键ctrl+4- 它将为您提供完整的结果.

  • 总是缺少的一项是通过 **SQL 作业步骤** 进行搜索。我见过很少有搜索未运行的情况,并且我们一直在寻找在查询涵盖的所有对象之外更新数据的内容。 (2认同)

ste*_*ary 22

Redgate的SQL搜索是一个很好的工具,它是SSMS的免费插件.


Mil*_*lan 18

请把它作为一个"肮脏"的替代方案,但这特别是当我不熟悉数据库项目时,这使我多次失败.有时您试图在所有SP中搜索字符串并忘记某些相关逻辑可能隐藏在函数和触发器之间或者它的操作步骤可能与你想象的不同.

在MSSMS中,您可以右键单击数据库并选择 Tasks -> Generate Scripts向导,将所有SP,Fns和触发器输出到单个.sql文件中.

在此输入图像描述

一定要选择触发器!

在此输入图像描述

然后只需使用Sublime或Notepad搜索您需要查找的字符串.我知道这可能是非常低效和偏执的方法,但它的工作:)


小智 12

你也可以用这个:

SELECT * 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_DEFINITION like '%Search_String%'
Run Code Online (Sandbox Code Playgroud)

  • -1与其他选项相比,下行是"INFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITION"仅保存例程的前4000个字符. (9认同)

Ani*_*ngh 8

它可能对你有所帮助!

SELECT DISTINCT 
      A.NAME AS OBJECT_NAME,
      A.TYPE_DESC
      FROM SYS.SQL_MODULES M 
      INNER JOIN SYS.OBJECTS A ON M.OBJECT_ID = A.OBJECT_ID
      WHERE M.DEFINITION LIKE '%['+@SEARCH_TEXT+']%'
      ORDER BY TYPE_DESC
Run Code Online (Sandbox Code Playgroud)


小智 8

SELECT name , type_desc , create_date , modify_date
FROM   sys.procedures 
WHERE  Object_definition(object_id) LIKE '%High%'
Run Code Online (Sandbox Code Playgroud)


use*_*101 7

select top 10 * from
sys.procedures
where object_definition(object_id) like '%\[ABD\]%'
Run Code Online (Sandbox Code Playgroud)


小智 6

SELECT DISTINCT 
   o.name AS Object_Name,
   o.type_desc
FROM sys.sql_modules m        INNER JOIN        sys.objects o 
     ON m.object_id = o.object_id WHERE m.definition Like '%[String]%';
Run Code Online (Sandbox Code Playgroud)


小智 5

您也可以使用:

SELECT OBJECT_NAME(id) 
    FROM syscomments 
    WHERE [text] LIKE '%flags.%' 
    AND OBJECTPROPERTY(id, 'IsProcedure') = 1 
    GROUP BY OBJECT_NAME(id)
Run Code Online (Sandbox Code Playgroud)

那包括评论

  • 您不应为此目的使用syscomments。文本字段截断为4000个字符。sys.sql_modules中的定义字段似乎存储了整个文本(总之超过4000个) (3认同)

Ata*_*lan 5

 SELECT DISTINCT OBJECT_NAME([id]),[text] 

 FROM syscomments   

 WHERE [id] IN (SELECT [id] FROM sysobjects WHERE xtype IN 

 ('TF','FN','V','P') AND status >= 0) AND  

 ([text] LIKE '%text to be search%' ) 
Run Code Online (Sandbox Code Playgroud)

OBJECT_NAME([id]) --> 对象名称(视图、存储过程、标量函数、表函数名称)

id (int) = 对象标识号

xtype char(2) 对象类型。可以是以下对象类型之一:

FN = 标量函数

P = 存储过程

V = 视图

TF = 表函数


Wei*_*Guo 5

我创建了一个过程来搜索过程/函数、表、视图或作业中的文本。第一个参数@search是搜索条件,@target是搜索目标,即程序、表格等。如果不指定,则搜索全部。@db是指定要搜索的数据库,默认为你当前的数据库。这是我的动态 SQL 查询。

ALTER PROCEDURE [dbo].[usp_find_objects]
(
    @search VARCHAR(255),
    @target VARCHAR(255) = NULL,
    @db VARCHAR(35) = NULL
)
AS

SET NOCOUNT ON;

DECLARE @TSQL NVARCHAR(MAX), @USEDB NVARCHAR(50)

IF @db <> '' SET @USEDB = 'USE ' + @db
ELSE SET @USEDB = ''

IF @target IS NULL SET @target = ''

SET @TSQL = @USEDB + '

DECLARE @search VARCHAR(128) 
DECLARE @target VARCHAR(128)

SET @search = ''%' + @search + '%''
SET @target = ''' + @target + '''

IF @target LIKE ''%Procedure%'' BEGIN
    SELECT o.name As ''Stored Procedures''
    FROM SYSOBJECTS o 
    INNER JOIN SYSCOMMENTS c ON o.id = c.id
    WHERE c.text LIKE @search
        AND o.xtype IN (''P'',''FN'')
    GROUP BY o.name
    ORDER BY o.name
END

ELSE IF @target LIKE ''%View%'' BEGIN
    SELECT o.name As ''Views''
    FROM SYSOBJECTS o 
    INNER JOIN SYSCOMMENTS c ON o.id = c.id
    WHERE c.text LIKE @search
        AND o.xtype = ''V''
    GROUP BY o.name
    ORDER BY o.name
END

/* Table - search table name only, need to add column name */
ELSE IF @target LIKE ''%Table%'' BEGIN
    SELECT t.name AS ''TableName''
    FROM sys.columns c 
    JOIN sys.tables t ON c.object_id = t.object_id
    WHERE c.name LIKE @search
    ORDER BY TableName
END

ELSE IF @target LIKE ''%Job%'' BEGIN
    SELECT  j.job_id,
        s.srvname,
        j.name,
        js.step_id,
        js.command,
        j.enabled 
    FROM    [msdb].dbo.sysjobs j
    JOIN    [msdb].dbo.sysjobsteps js
        ON  js.job_id = j.job_id 
    JOIN    master.dbo.sysservers s
        ON  s.srvid = j.originating_server_id
    WHERE   js.command LIKE @search
END

ELSE BEGIN 
    SELECT o.name As ''Stored Procedures''
    FROM SYSOBJECTS o 
    INNER JOIN SYSCOMMENTS c ON o.id = c.id
    WHERE c.text LIKE @search
        AND o.xtype IN (''P'',''FN'')
    GROUP BY o.name
    ORDER BY o.name

    SELECT o.name As ''Views''
    FROM SYSOBJECTS o 
    INNER JOIN SYSCOMMENTS c ON o.id = c.id
    WHERE c.text LIKE @search
        AND o.xtype = ''V''
    GROUP BY o.name
    ORDER BY o.name

    SELECT t.name AS ''Tables''
    FROM sys.columns c 
    JOIN sys.tables t ON c.object_id = t.object_id
    WHERE c.name LIKE @search
    ORDER BY Tables

    SELECT  j.name AS ''Jobs''
    FROM    [msdb].dbo.sysjobs j
    JOIN    [msdb].dbo.sysjobsteps js
        ON  js.job_id = j.job_id 
    JOIN    master.dbo.sysservers s
        ON  s.srvid = j.originating_server_id
    WHERE   js.command LIKE @search
END
'

EXECUTE sp_executesql @TSQL
Run Code Online (Sandbox Code Playgroud)

更新: 如果您重命名了一个过程,它只会更新sysobjects,但不会更新syscomments,这会保留旧名称,因此该过程将不会包含在搜索结果中,除非您删除并重新创建该过程。