如何找到SP参考

时间:2009-10-07 05:03:30

标签: sql sql-server sql-server-2005 tsql

我想知道是否在任何地方引用了一个SP。目前我正在使用SP_DEPENDS进行检查。

有没有其他方法来检查这个......?

3 个答案:

答案 0 :(得分:3)

如果您的依赖项被破坏,我现在想的唯一方法就是输出一个包含所有存储过程定义的SQL文件,然后使用您喜欢的源代码编辑器在.sql文件中搜索依赖项。

答案 1 :(得分:1)

尝试:

SELECT OBJECT_NAME(m.object_id), m.*
  FROM SYS.SQL_MODULES m
 WHERE m.definition LIKE N'%my_sp_name%'

请注意,SYSCOMMENTS和INFORMATION_SCHEMA.ROUTINES具有nvarchar(4000)列。因此,如果在位置3998使用my_sp_name,则无法找到它。 SYSCOMMENTS确实有多行但ROUTINES截断。

参考:Listing SQL Server Object Dependencies

答案 2 :(得分:0)

我编写此查询以搜索所选字符串的“代码对象”(包括过程,函数,触发器,视图以及其他任何驻留在sys.sql_modules中的内容),无论是表,列,注释还是存储过程名称。我有理由相信这会解释字符串在不同数据页面中“拆分”的可能性。

返回的列是:

  • 拥有架构
  • 对象名称
  • 对象类型(根据sys.objects中的type_desc)
  • 代码长度(以字节为单位)(有时有助于了解代码的大小)
  • 包含字符串
  • 的实际代码

这将仅列出字符串所在的对象。如果你搜索,说“声明”,你可能会得到数据库中的每个过程和函数。它也不评估字符串的使用方式。如果您的程序名称(仅)存在于另一个程序的注释中,则将列出该程序。

简而言之,这是一个起点。它将列出您的字符串存在的位置;然后你必须进入并审查每个案例,以确定它是如何使用的。

DECLARE @SearchText   varchar(100)

SET @SearchText = 'YourTextHere'

SELECT
   schema_name(ob.schema_id)  SchemaName
  ,ob.name
  ,ob.type_desc
  ,len(mo.definition) CodeLength
  ,mo.definition
 from sys.sql_modules mo
  inner join .sys.objects ob
   on ob.object_id = mo.object_id
 where mo.definition like '%' + @SearchText + '%'
 order by
   case schema_name(ob.schema_id)
     when 'dbo' then 'A'
     else 'B' + str(ob.schema_id, 10)
   end
  ,ob.type_desc
  ,ob.name