解析存储过程
问题描述:
有没有办法扫描SQL Server来查找所有存储过程,读取它们的正文并确定它们使用的表的列表?我的目的是对大型遗留数据库执行分析。 (SQL服务器2008 R2,最好是C#,但语言是无关紧要)。解析存储过程
答
充分利用SQL Server的sp_depends
系统存储过程。
1)获取所有存储过程的列表。
select specific_name from information_schema.routines
where routine_type='PROCEDURE' and specific_name not like 'sp_%'
2)使用与sp_depends
沿着这个列表,并插入其结果插入表中。
declare @t table([name] varchar(50),[type] varchar(50),
updated varchar(10),selected varchar(10),[column] varchar(50))
insert into @t exec sp_depends 'MyProc1';
insert into @t exec sp_depends 'MyProc2';
insert into @t exec sp_depends 'MyProc3';
select [name] from @t group by [name];
答
我想这可能工作:
SELECT routine_name, routine_definition FROM information_schema.routines WHERE routine_definition in (SELECT '%' +name+ '%' FROM sys.tables) AND routine_type IN ('function', 'pocedure')
答
是对于前两点是肯定的:
SELECT
pr.Name,
mod.Definition
FROM sys.procedures pr
INNER JOIN sys.sql_modules mod ON pr.object_id = mod.object_id
一旦你的存储过程体(在sql_modules
,列definition
),您可以解析它 - 但这将有点凌乱至多 - 不知道是否有更方便的方法来做到这一点...
Answer也许在这里编辑? http://*.com/questions/1916489/how-to-write-a-query-for-sql-server-2008-that-returns-the-dependencies-of-an-obj –
一些提示在这里的评论:http://forums.asp.net/t/1225902.aspx我们在我们的数据库做类似的事情,虽然我们已经修改它使用一些专有代码,所以我不能发布它。我们的版本让我们可以搜索服务器上的所有数据库,或者只搜索我们使用变量发送的数据库。 。 – HLGEM