表中的存储过程列表

Posted

技术标签:

【中文标题】表中的存储过程列表【英文标题】:List of Stored Procedure from Table 【发布时间】:2010-09-12 06:59:31 【问题描述】:

我有一个包含 100 个表和存储过程的庞大数据库。使用 SQL Server 2005,如何获取对给定表执行插入或更新操作的存储过程列表。

【问题讨论】:

【参考方案1】:

sys.sql_dependencies 有一个具有依赖关系的实体列表,包括存储过程在查询中包含的表和列。请参阅this post 获取获取依赖项的查询示例。下面的代码sn-p会通过存储过程得到一个表/列依赖的列表

select sp.name       as sproc_name
      ,t.name        as table_name
      ,c.name        as column_name
 from sys.sql_dependencies d
 join sys.objects t
   on t.object_id = d.referenced_major_id
 join sys.objects sp
   on sp.object_id = d.object_id
 join sys.columns c
   on c.object_id = t.object_id
  and c.column_id = d.referenced_minor_id
where sp.type = 'P'

【讨论】:

MSDN Library 表示现在已弃用,应替换为 sys.sql_expression_dependencies。不幸的是,我无法获得同等的工作。在答案中显示的查询中 d.object_id 不再存在。我试过 d.referencing_id 但这也没有用。知道如何使用 sql_expression_dependencies 吗? sys.sql_expression_dependencies上,referencing_id是引用目标的项,referenced_id是依赖项。该表还具有表中引用实体的架构和实体名称。次要 ID 指的是列号,0 表示没有特定的列引用。 我想我已经掌握了所有这些。我认为问题在于我所有的 sql_expression_dependencies 行的 referenced_minor_id 都为 0。 sql_dependencies 的类似查询返回了许多非零行,我很惊讶结果与它们一样不同。它似乎有效地降低了 sql_expression_dependencies 的用处,因为我经常想查看哪些存储过程引用了特定的列。作为参考,我从 where referenced_minor_id 0 中都做了一个 select count(*)。在 sql_dependencies 中有 38119 个这样的行,在 sql_expression_dependencies 中有 112 个。 @Drew - 是的,看起来存储过程引用没有列出 sys.sql_expression_dependencies 中的各个列。 SQL Server 2008+ 中有一些函数 - sys.dm_sql_referencing_entitiessys.dm_sql_referenced_entities - 将对特定实体执行此操作,并返回具有列级依赖关系的记录集。【参考方案2】:
select
  so.name,
  sc.text
from
  sysobjects so inner join syscomments sc on so.id = sc.id
where
  sc.text like '%INSERT INTO xyz%'
  or sc.text like '%UPDATE xyz%'

这将为您提供所有存储过程内容的列表,其中包含特定表的 INSERT 或 UPDATE(您显然可以调整查询以适应)。此外,较长的过程将在返回的记录集中的多行中中断,因此您可能需要对结果进行一些手动筛选。

编辑:调整查询以返回 SP 名称。另外,请注意上述查询将返回任何 UDF 以及 SP。

【讨论】:

这给了我 SP id...我可以用这个 id 找到 SP 名称吗? 是的,我已经调整了查询​​以包含它。我看到现在发布了其他几个答案,它们也可以帮助您。 我在这里的回答:***.com/questions/119679/… 几乎相同(返回名称)。但是,我认为 Luke 是对的,因为我的回答中没有必要使用 DISTINCT 它有效,但并非适用于所有情况。例如,如果有人在 SQL 关键字和表名之间使用了更多的空格或制表符。【参考方案3】:

使用 sys.dm_sql_reference_entities

请注意 sp_depends 已过时。

MSDN Reference

【讨论】:

【参考方案4】:

您可以尝试将所有存储过程导出到一个文本文件中,然后使用简单的搜索。

更高级的技术是使用正则表达式搜索来查找所有 SELECT FROM 和 INSERT FROM 条目。

【讨论】:

【参考方案5】:

如果您从 Vyaskn 的网站下载 sp_search_code,它将允许您在数据库对象中找到任何文本。

http://vyaskn.tripod.com/sql_server_search_stored_procedure_code.htm

【讨论】:

【参考方案6】:

这似乎有效:

select   
so.name as [proc],   
so2.name as [table],   
sd.is_updated   
from sysobjects so   
inner join sys.sql_dependencies sd on so.id = sd.object_id  
inner join sysobjects so2 on sd.referenced_major_id = so2.id  
where so.xtype = 'p' -- procedure  
and is_updated = 1 -- proc updates table, or at least, I think that's what this means

【讨论】:

【参考方案7】:
SELECT Distinct SO.Name
FROM sysobjects SO (NOLOCK)
INNER JOIN syscomments SC (NOLOCK) on SO.Id = SC.ID
AND SO.Type = 'P'
AND (SC.Text LIKE '%UPDATE%' OR SC.Text LIKE '%INSERT%')
ORDER BY SO.Name

This link 被用作 SP 搜索的资源。

【讨论】:

以上是关于表中的存储过程列表的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver存储过程如何定期删除表中的数据 求代码

存储过程将不同表中的值相乘

将表中的列值作为参数传递给存储过程 sql

Redshift中的存储过程将数据加载到表中

如何通过存储过程更改列名并更改表中的值?

oracle的存储过程