我有一个包含100个表和存储过程的庞大数据库。使用SQL Server 2005,如何获取正在对给定表执行插入或更新操作的存储过程列表。
答案 0 :(得分:14)
sys.sql_dependencies
包含具有依赖关系的实体列表,包括sproc在查询中包含的表和列。有关获取依赖项的查询示例,请参阅this post。下面的代码片段将按存储过程
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'
答案 1 :(得分: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。
答案 2 :(得分:2)
答案 3 :(得分:1)
您可以尝试将所有存储过程导出到文本文件中,然后使用简单搜索。
更高级的技术是使用正则表达式搜索来查找所有SELECT FROM和INSERT FROM条目。
答案 4 :(得分: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
答案 5 :(得分:1)
如果从Vyaskn的网站下载sp_search_code,它将允许您在数据库对象中查找任何文本。
http://vyaskn.tripod.com/sql_server_search_stored_procedure_code.htm
答案 6 :(得分: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
This link被用作SP搜索的资源。