你能搜索SQL Server 2005存储过程的内容吗?

25

SQL Server 2005。我正在查看一个包含500多个存储过程的数据库,试图了解它们与数据的交互方式 - 特别是关于如何插入/修改数据。我希望能找到一个“搜索”或“查找”功能,可以检查实际过程的内容。这样,我就可以搜索所有与某个表名有关的存储过程。SQL Management Studio的基本查找功能只查看已打开文件中的内容,而在文件中查找似乎仅在我已经打开存储过程时才会查找其内容,而且仅在...\ Local Settings \ Temp \ ~ vs1011.sql临时类型文件中进行。

目前,我知道获取底层过程的唯一方法是右键单击并选择“修改”(或Script Stored Procedure As=>Create or Alter)。有没有更快/更简便的方法来搜索/检查所有sproc?


2
尽管我非常喜欢 SQL Server,但微软似乎并不特别重视存储过程,因为它们只提供最基本的功能供您使用。除了您的问题外,我希望能够将它们组织成虚拟“文件夹”,具备内置版控等其他功能。 - Matt Peterson
同意。即使只是能够在公共接口或私有库中将它们视觉上分开也会有所帮助。 - Joel Coehoorn
16个回答

26

除了在这里提到的工具之外,可以尝试使用第三方工具,例如ApexSQL Search(免费)或SSMS Toolpack(免费)。

过去我曾经遇到与这类似的问题,当我继承了一个包含500多个对象的数据库时。我的经验是查询还好,但真正有帮助的是第三方SSMS插件。


25

不要使用INFORMATION_SCHEMA.ROUTINES,它仅限于4000个字符。应该从sys.sql_modules中获取。

SELECT o.type_desc AS ROUTINE_TYPE
        ,o.[name] AS ROUTINE_NAME
        ,m.definition AS ROUTINE_DEFINITION
FROM sys.sql_modules AS m
INNER JOIN sys.objects AS o
    ON m.object_id = o.object_id
WHERE m.definition LIKE '%search term here%'

(按原文,这也会返回触发器、视图和标量函数。如果想排除这些,请按类型进行筛选)


你可以这样做: 选择 * 从 INFORMATION_SCHEMA.ROUTINES WHERE OBJECTPROPERTY(OBJECT_ID(SPECIFIC_NAME),'IsMSShipped') =0 并且 OBJECT_DEFINITION(OBJECT_ID(SPECIFIC_NAME)) like '%在此处输入搜索词%' AND ROUTINE_TYPE='PROCEDURE' - SQLMenace
对于少于4000个字符的任何内容,这都可以正常工作。如果您有更长的存储过程,则需要使用sys.sql_modules。 - BradC

15

你可以使用 Information_Schema.Routines 视图。

select * 
FROM   INFORMATION_SCHEMA.ROUTINES 
WHERE  OBJECTPROPERTY(OBJECT_ID(SPECIFIC_NAME),'IsMSShipped') =0 
       and OBJECT_DEFINITION(OBJECT_ID(SPECIFIC_NAME)) like '%search term here%' 
       AND ROUTINE_TYPE='PROCEDURE'

5
Information_Schema.Routines 是有 4000 个字符的限制的。如果您知道您存储的过程长于此,请改用 sys.sql_modules。 - BradC

4

使用这个工具,生活会变得轻松许多! - Mathias F

3

将数据批量导出为文本文件,然后使用Google桌面进行索引。


这不是个坏主意,但你需要小心,每次存储过程改变时都要刷新本地文本副本。 - JosephStyons

2
select top 10 * from syscomments
您也可以找到sp_grep,它是一个流行的过程,虽然没有包含在内,但可以实现此功能。

2

可以。

  1. 你可以从sys.syscomments表中选择*

  2. 如果你拥有VS for Database Pro,你可以新建一个数据库项目并从数据库导入架构,在项目中进行搜索。


2
SELECT DISTINCT OBJECT_NAME(id) AS ObjectName, [Text] AS CodeSnippet 
FROM syscomments (nolock) 
WHERE [TEXT] LIKE '%Whatever You Want To Search For%'

不建议使用syscomments存储过程定义,如果存储过程超过一行的长度,它将在多行中存储。 - SQLMenace

1

在“放置存储过程名称”处输入您的存储过程名称

sp_msforeachdb'SELECT DISTINCT o.name, o.xtype FROM ?.dbo.syscomments c INNER JOIN ?.dbo.sysobjects o ON c.id=o.id WHERE c.TEXT LIKE ''%放置存储过程名称%'''


0
如果你想要一个友好的界面,我可以推荐Idera公司的经济实惠的SQL管理工具集。除了其他工具外,它还有一个很好的SQL搜索实用程序,可以在存储过程(或任何其他地方)中查找字符串,并帮助您导航它们。

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