表中的存储过程列表
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_entities
、sys.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 搜索的资源。
【讨论】:
以上是关于表中的存储过程列表的主要内容,如果未能解决你的问题,请参考以下文章