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

Gar*_*del 295 t-sql sql-server stored-procedures sql-server-2008

我需要在SQL Server 2008中搜索包含数据库字段名称或变量名称的存储过程.

Kas*_*hif 530

SELECT ROUTINE_NAME, ROUTINE_DEFINITION
    FROM INFORMATION_SCHEMA.ROUTINES 
    WHERE ROUTINE_DEFINITION LIKE '%Foo%' 
    AND ROUTINE_TYPE='PROCEDURE'
Run Code Online (Sandbox Code Playgroud)
SELECT OBJECT_NAME(id) 
    FROM SYSCOMMENTS 
    WHERE [text] LIKE '%Foo%' 
    AND OBJECTPROPERTY(id, 'IsProcedure') = 1 
    GROUP BY OBJECT_NAME(id)
Run Code Online (Sandbox Code Playgroud)
SELECT OBJECT_NAME(object_id)
    FROM sys.sql_modules
    WHERE OBJECTPROPERTY(object_id, 'IsProcedure') = 1
    AND definition LIKE '%Foo%'
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您有一个很长的程序,routine_definition会被裁剪为4000个字符.请改用OBJECTPROPERTY方法. (55认同)
  • 您能否为3个查询中的每个查询添加一些解释,以及它们之间的区别是什么? (10认同)
  • 包括架构名称:OBJECT_SCHEMA_NAME(OBJECT_ID) AS [架构] (3认同)
  • @PeteT 所说的一百万倍。几年前,这个 4000 个字符的限制真的让我很头疼。 (2认同)
  • 很高兴有一些关于每个查询正在做什么以及它们如何不同或为什么一个比另一个更好的细节.这些答案鼓励经验不足的工程师进行盲/复制粘贴,并对使用新的RDBMS(如SQL Server)的高级工程师感到沮丧. (2认同)

mar*_*c_s 75

抓住自己的免费 Red-Gate SQL搜索工具的副本,开始享受在SQL Server中搜索!:-)

在此输入图像描述

这是一个非常有用的工具,是的!它完全免费,任何用途都是免费的.

  • 这是一个很好的工具,在我遇到这个问题之前我一直在使用它.值得注意的是,它默认将搜索结果限制为150.查看此[论坛帖子](http://www.red-gate.com/messageboard/viewtopic.php?t=13690)了解如何增加该限制的信息. (5认同)

Dav*_*ers 36

您还可以尝试从ApexSQL免费获得ApexSQL Search SSMS插件.

在此输入图像描述


Los*_*ear 28

我接受了Kashif的回答并将他们所有人联合起来.奇怪的是,有时候,我在其中一个选择中找到了结果而在另一个选择中找不到结果.所以为了安全起见,我在寻找东西时全部运行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
Run Code Online (Sandbox Code Playgroud)


Gar*_*del 10

SELECT ROUTINE_NAME, ROUTINE_DEFINITION 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_DEFINITION LIKE '%FieldName%' 
AND ROUTINE_TYPE='PROCEDURE'
Run Code Online (Sandbox Code Playgroud)

  • 但是要小心,因为它只是*子串匹配."FieldName"可能出现在注释,字符串常量或类似的东西中.另外,我怀疑`[无论如何]`会捕获`无论什么`(当你在寻找模式限定标识符时变得更重要). (2认同)
  • 请参阅上面接受的答案中@PeteT 的评论。INFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITION 被裁剪为 4000 个字符。因此,如果您的存储过程超过 4000 个字符,则此方法将不起作用。 (2认同)

小智 10

如果您还需要架构:

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 
Run Code Online (Sandbox Code Playgroud)


San*_*ndy 7

我试过上面的例子,但它没有显示超过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
Run Code Online (Sandbox Code Playgroud)


Mou*_*rad 7

对于任何高于 SQL Server 2000 的 SQL Server:

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
Run Code Online (Sandbox Code Playgroud)

如果有人被 SQL Server 2000 困住,表 sql_modules 不存在,因此您可以使用 syscomments,您将获得大于 4000 个字符的存储过程的多条记录,但它们将具有相同的c.number字段,以便您可以分组将各个部分组合在一起以获得完整的存储过程文本:

    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        
Run Code Online (Sandbox Code Playgroud)


Yuc*_*uci 6

首先确保您在用户凭据下以及正确的数据库上下文中运行查询.

USE YOUR_DATABASE_NAME;
Run Code Online (Sandbox Code Playgroud)

否则,sys.procedures将不返回任何内容.现在运行查询如下:

select * from sys.procedures p 
join sys.syscomments s on p.object_id = s.id 
where text like '%YOUR_TEXT%';
Run Code Online (Sandbox Code Playgroud)

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

select * from YOUR_DATABASE_NAME.INFORMATION_SCHEMA.ROUTINES
where ROUTINE_DEFINITION like '%YOUR_TEXT%';
Run Code Online (Sandbox Code Playgroud)

我在Microsoft SQL Server 2008 R2(SP1)上测试 - 10.50.2500.0(X64)