8

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

4

7 回答 7

14

sys.sql_dependencies有一个具有依赖关系的实体列表,包括 sproc 在查询中包含的表和列。有关获取依赖项的查询示例,请参阅这篇文章。下面的代码片段将通过存储过程获取表/列依赖项列表

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'
于 2008-09-23T14:27:48.183 回答
10
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。

于 2008-09-23T08:02:49.903 回答
2

使用 sys.dm_sql_referencing_entities

请注意 sp_depends 已过时。

MSDN 参考

于 2008-09-23T08:01:57.377 回答
1

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

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

于 2008-09-23T07:56:42.507 回答
1

这似乎有效:

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
于 2008-09-23T08:08:09.513 回答
1

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

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

于 2008-09-23T09:48:48.853 回答
0
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

此链接被用作 SP 搜索的资源。

于 2008-09-23T08:00:36.037 回答