如何使用grep搜索SQL Server存储过程?

7
我希望能在给定的SQL Server数据库(假设为2005或更高版本)上运行标准grep,以查找所有存储过程。我已经找到了许多简单的查询来列出包含特定对象的存储过程的名称,例如:
SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%table_I_want_to_find%'

但是我真正想要的是像grep一样列出已识别的存储过程中的特定行(这样我就不必手动打开每个存储过程并查看它是否符合我的要求)。

我可以接受使用T-SQL或PowerShell,甚至是现成的实用程序来解决问题。


这里有一个名为sp_grep的存储过程解决方案,用于在所有存储过程中搜索模式并打开它。 - wwmbes
3个回答

7

+1 赞同 - 很棒的工具,而且还是 免费 的!不可或缺! - marc_s
我同意,Icarus。我完全忘记了Red Gate的优秀工具——它正好满足我的需求。 - Michael Sorens

3

我对SQL Server还很陌生,但以下内容似乎很好用,已经被证明非常有用。我正在使用SQL Server 2008。

select ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_TYPE, ROUTINE_BODY, ROUTINE_DEFINITION
from INFORMATION_SCHEMA.ROUTINES
where ROUTINE_DEFINITION like '%searchtext%'
order by ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_TYPE, ROUTINE_DEFINITION;

为了完整起见,以下是一些类似的查询,您可能会想了解:

exec sp_help 'myTable'

select name
from sys.all_views
order by name;

select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE
from INFORMATION_SCHEMA.TABLES
order by TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE;

select TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE
from INFORMATION_SCHEMA.COLUMNS
where COLUMN_NAME = 'myColumn'
order by TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME;

不好的想法,ROUTINE_DEFINITION是一个varchar(8000)。如果您的存储过程超过8000个字符,则无法找到超过8000限制的引用。我曾经遇到过这种情况...相反,请使用sys.whatever中的object_definition(object_id),它具有varchar(max)。 - Stefan Steiger
  1. 第一种解决方案可以找到包含搜索字符串的过程。
  2. 然后将所有ROUTINE_DEFINITION粘贴到免费的notepad++中。
  3. 使用Ctrl-F进行搜索,"在当前文档中查找所有"会给出带有行号的结果。
  4. 双击一行即可跳转到该行。
  5. 向后搜索过程名称。
请注意Stefan的警告。
- wwmbes
这里有一个名为sp_grep的存储过程解决方案,可以搜索所有存储过程中的模式并打开它。 - wwmbes

0

您可以使用 SMO 将存储过程 DDL 转储到文件中,然后在这些文件上使用 grep。

这里有一些提取 DDL 的示例(称为脚本编写)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接