解析存储过程

问题描述:

有没有办法扫描SQL Server来查找所有存储过程,读取它们的正文并确定它们使用的表的列表?我的目的是对大型遗留数据库执行分析。 (SQL服务器2008 R2,最好是C#,但语言是无关紧要)。解析存储过程

+0

Answer也许在这里编辑? http://*.com/questions/1916489/how-to-write-a-query-for-sql-server-2008-that-returns-the-dependencies-of-an-obj –

+0

一些提示在这里的评论:http://forums.asp.net/t/1225902.aspx我们在我们的数据库做类似的事情,虽然我们已经修改它使用一些专有代码,所以我不能发布它。我们的版本让我们可以搜索服务器上的所有数据库,或者只搜索我们使用变量发送的数据库。 。 – HLGEM

充分利用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]; 

More on sp_depends

+0

虽然这对跨数据库依赖关系不起作用。 – JNK

+0

@JNK:我错过了OP希望跨数据库功能的部分。 –

+0

他没有提到它,但我想指出'sp_depends'不会准确地报告数据库之间的依赖关系。 – JNK

不知道这是否可以帮助,但你可以在对象资源管理器SQL Management Studio中任何数据库上单击鼠标右键,使用任务 - - >生成脚本生成一个包含所有存储特效(或任何对象)的大型脚本。在这一点上,它只是一个文本文件,你可以解析任何你想要的。

+0

我的印象是OP想要在大型数据库上实现这种自动化或半自动化的方式,这听起来有点麻烦...... – MJB

+0

她的第一句话意味着多个数据库,然而她接着提到一个单一的大型数据库 - “我的目的是对大型遗留数据库进行分析。”因为我知道这个方法适用于单个数据库而不会非常麻烦,所以我想我会提出这个建议。 – Terry

我想这可能工作:

 
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),您可以解析它 - 但这将有点凌乱至多 - 不知道是否有更方便的方法来做到这一点...