如何使用SQL Server 2008查找基于表名搜索的存储过程的名称?

时间:2011-08-03 09:23:35

标签: sql sql-server sql-server-2008 stored-procedures

我想找到正在使用特定表的所有存储过程。数据库中有很多存储过程,因此检查每个过程是不可行的。

有没有办法使用搜索查询以便我可以找到存储过程?

我试过这段代码:

SELECT distinct so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '% RejectionReason %'

RejectionReason是我的表名,但它显示了RejectionReason用作列名的所有过程,因此不起作用。

9 个答案:

答案 0 :(得分:21)

SELECT o.name, o.type_desc, p.name, p.type_desc
FROM sys.sql_dependencies d
INNER JOIN sys.objects o
    ON d.object_id = o.object_id
INNER JOIN sys.objects p
    ON d.referenced_major_id = p.object_id
    AND o.name = 'RejectionReason'

SELECT o.name, t.TABLE_NAME, c.text 
  FROM syscomments c 
  JOIN sysobjects o 
    ON c.id = o.id
  JOIN INFORMATION_SCHEMA.Tables t
    ON  c.text LIKE '%RejectionReason%' 

EXEC sp_depends @objname = N'RejectionReason';

如果这些都没有帮助您查看此博客: http://blog.sqlauthority.com/2010/02/04/sql-server-get-the-list-of-object-dependencies-sp_depends-and-information_schema-routines-and-sys-dm_sql_referencing_entities/

答案 1 :(得分:4)

尝试使用RedGate的免费工具SQL Search

答案 2 :(得分:3)

这是一段希望它可以工作的代码。只需更改它取决于您的代码的表名

SELECT DISTINCT so.name 
FROM syscomments sc INNER JOIN sysobjects so on sc.id=so.id 
WHERE sc.text LIKE '%tablename%'

e.g:

SELECT DISTINCT so.name 
FROM syscomments sc INNER JOIN sysobjects so on sc.id=so.id 
WHERE sc.text LIKE '%users%'

您将获得商店程序列表和表格关系。

答案 3 :(得分:1)

根据MSDN sp_depends将在以后的版本中删除,以防您使用它,您可以改为使用以下query

SELECT referencing_schema_name, referencing_entity_name, referencing_id, referencing_class_desc, is_caller_dependent
FROM sys.dm_sql_referencing_entities ('dbo.TableName', 'OBJECT');

答案 4 :(得分:0)

我知道有两种可能性。

首先,SQL Management Studio有一个显示依赖关系的选项。右键单击表并选择View Dependencies但是,这不会突出显示表名嵌入动态SQL的usps。

第二个选项是右键单击数据库并选择Generate Scripts。按照向导并将所有usps脚本添加到新的查询窗口,然后在其中搜索表的名称。这更费力,但会找到所有用途。

答案 5 :(得分:0)

我想这个脚本会显示表的所有依赖对象,包括SP。

USE MYDatabase
GO

DECLARE @TableName varchar(100)
SET @TableName = 'mytable'

SELECT
 SourceSchema                  = OBJECT_SCHEMA_NAME(sed.referencing_id)
 ,SourceObject                 = OBJECT_NAME(sed.referencing_id)
 ,ReferencedDB                 = ISNULL(sre.referenced_database_name, DB_NAME())
 ,ReferencedSchema             = ISNULL(sre.referenced_schema_name,
OBJECT_SCHEMA_NAME(sed.referencing_id))
 ,ReferencedObject             = sre.referenced_entity_name
 ,ReferencedColumnID   = sre.referenced_minor_id
 ,ReferencedColumn             = sre.referenced_minor_name
FROM sys.sql_expression_dependencies sed
CROSS APPLY sys.dm_sql_referenced_entities(OBJECT_SCHEMA_NAME(sed.referencing_id)
+ '.' + OBJECT_NAME(sed.referencing_id), 'OBJECT') sre
WHERE sed.referenced_entity_name = @TableName
AND sre.referenced_entity_name = @TableName

了解更多详情,请查看。 http://sqlserverplanet.com/sql-server-2008/find-dependent-objects/

答案 6 :(得分:0)

我正在使用以下SQL脚本在数据库的所有存储过程中搜索列名文本。您也可以使用它来查找存储过程中的表。

在变量 @SearchFor 中指定搜索字词(正如您在LIKE表达式中使用它一样,例如 '%LastName%' 查找包含 LastName 的列和存储过程。

它将在表中找到列名以及存储过程中的文本。如果将@SPNameOnly设置为0,脚本甚至可以显示SP源代码。

--
-- Purpose: Search field names in all tables, views stored procedures
--

DECLARE @SearchFor nvarchar(max)='%Search_SP_Or_Table_Or_View%' -- search for this string
DECLARE @SearchSP bit = 1 -- 1=search in SPs as well
DECLARE @DisplaySPSource bit = 1 -- 1=display SP source code

-- tables
if (@SearchSP=1) begin  
  (
  select '['+c.table_Schema+'].['+c.table_Name+'].['+c.column_name+']' [schema_object], 
            t.table_type 
  from information_schema.columns c
  left join information_schema.Tables t on c.table_name=t.table_name
  where column_name like @SearchFor or t.table_name like @SearchFor 
  UNION
  select '['+routine_Schema+'].['+routine_Name+']' [schema_object], 
         'PROCEDURE' as table_type from information_schema.routines
  where routine_definition like @SearchFor or routine_name like @SearchFor 
        and routine_type='procedure'
  )
  order by table_type, schema_object
end else begin
  select '['+c.table_Schema+'].['+c.table_Name+'].['+c.column_name+']' [schema_object], 
         t.table_type 
  from information_schema.columns c
  left join information_schema.Tables t on c.table_name=t.table_name
  where column_name like @SearchFor or t.table_name like @SearchFor 
  order by c.table_Name, c.column_name
end     
-- stored procedure (source listing)
if (@SearchSP=1) begin      
    if (@DisplaySPSource=1) begin
      select '['+routine_Schema+'].['+routine_Name+']' [schema.sp], routine_definition 
      from information_schema.routines
      where routine_definition like @SearchFor  or routine_name like @SearchFor 
      and routine_type='procedure'
      order by routine_name
    end
end

答案 7 :(得分:0)

这将返回SP&#39和s。

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 '%TableName%'

答案 8 :(得分:0)

SysObjects存储有关数据库内所有对象的基本信息。它对您有用,因为它告诉我们每个对象的名称和对象的类型。

SysComments存储存储过程和函数的实际文本(代码)。它包含一个ID字段,该字段映射回SysObjects中的id字段。

select so.name, text
from sysobjects so, syscomments sc
where so.id = sc.id
and text like '%RejectionReason%'