表中的存储过程列表
我有一个庞大的数据库,其中包含100多个表和存储过程。使用SQL Server 2005,如何获取在给定表上执行插入或者更新操作的存储过程的列表。
解决方案
我们可以尝试将所有存储过程导出到文本文件中,然后使用简单的搜索。
一种更高级的技术是使用正则表达式搜索来查找所有SELECT FROM和INSERT FROM条目。
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搜索的资源。
使用sys.dm_sql_referencing_entities
请注意,sp_depends已过时。
MSDN参考
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。
这似乎可行:
选择 so.name为[proc], so2.name为[table], sd.is_updated 从sysobjects所以 在so.id = sd.object_id上的内部联接sys.sql_dependencies sd sd.referenced_major_id = so2.id上的内部联接sysobjects so2 其中so.xtype ='p'-过程 和is_updated = 1 -proc更新表,或者至少,我认为这是什么意思
如果从Vyaskn的网站下载sp_search_code,它将允许我们在数据库对象中查找任何文本。
http://vyaskn.tripod.com/sql_server_search_stored_procedure_code.htm
sys.sql_dependencies具有具有依赖性的实体的列表,包括存储在查询中的表和列。请参阅此帖子,以获取摆脱依赖关系的查询示例。下面的代码片段将按存储过程获取表/列依赖关系的列表
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'