2015-10-15 49 views
0

我被要求查找修改表格中字段名称的影响,并随后找到此更改的影响。解析数据库中的存储过程

尽管识别受影响的表格非常容易,但我在尝试识别受影响的存储过程时遇到了问题。

我也希望这个脚本也能帮助开发;能够识别所有必要的程序。

我在下面创建了一个临时表,其中包含过程名称和一个包含过程文本(sp_helptext)的字段。 我的计划(虽然不够高雅)可以获取过程名称,参数和过程文本,如果我可以将sp_helptext的内容放入字段中。

--drop procedure dbo.sp_getProcText 
create procedure dbo.sp_getProcText 
(
     @proc_name varchar(max), 
     @output varchar(max) output 
) 

AS 
    BEGIN 
     declare @exec_string varchar(max); 
     set @exec_string = 'sp_helptext' + ' ' + @proc_name 
     exec sp_executesql @exec_string, @output 
    END 
go 

create table #temp_sp_parse(proc_name varchar(max), proc_text varchar(max)); 
go 

declare @proc_text_out varchar(max) 

insert into 
    #temp_sp_parse (proc_name, proc_text) 
     select 
      sysobjects.name , exec dbo.sp_getProcText(sysobjects.name, @proc_text_out) 
     from 
      dbo.sysobjects 
     join 
      dbo.syscolumns on 
       syscolumns.id = sysobjects.id 
     where 
     (
      syscolumns.name like N'%rti%' and 
      sysobjects.name like '%%' 
     ) 
     and 
      sysobjects.type ='P' 
go 

select * from #temp_sp_parse 
drop procedure sp_getProcText 
drop table #temp_sp_parse 

MS SQL在插入操作中存在exec问题。

任何人都可以推荐一个修复或可能更好的解决方案。

+0

我的建议是要改变存储过程的名称,而不是使用** SP _ **前缀[Microsoft推荐](https://msdn.microsoft.com/ EN-US /库/ dd172115%28V = VS.100%29.aspx)。 –

+0

请标记使用的dbms。 (产品特定的代码在那里......) – jarlh

+0

备注:您应该**不要**为存储过程使用'sp_'前缀。微软已经保留了这个前缀以供自己使用(参见*命名存储过程*)](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx),以及你将来有可能冒着名字冲突的风险。 [这对你的存储过程性能也是不利的](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)。最好只是简单地避免使用'sp_'并使用别的东西作为前缀 - 或者根本没有前缀! –

回答

0

我写这个博客文章: http://anehir.blogspot.com.tr/2012/11/ms-sql-search-within-programmable.html

基本上你使用系统视图:sys.syscomments。
的完整代码如下:

declare @keyword1 varchar(50) = 'SomeTable' 
declare @keyword2 varchar(50) = 'SomeColumn' 

create table #t 
(
[ReferencingDatabase] varchar(100), 
[ReferencingSchema] varchar(100), 
[ReferencingObject] varchar(100), 
[ReferencingObjectType] varchar(100), 
[HelpText] varchar(300) 
) 

declare @cmd1 varchar(8000) 
set @cmd1 = ' 
use ? 
if ''?'' not in (''distribution'', ''master'', ''model'', ''msdb'', ''tempdb'', ''mssqlsystemresource'') 
begin 
insert into #t 
select 
    ''?'' as [ReferencingDatabase], 
    s.name as [ReferencingSchema], 
    o.name as [ReferencingObject], 
    o.type_desc as [ReferencingObjectType], 
    ''sp_helptext '''''' + s.Name + ''.'' + o.name + '''''''' as [Script] 
from sys.syscomments c 
left outer join sys.objects o on o.object_id = c.id 
left outer join sys.schemas s on s.schema_id = o.schema_id 
where 
c.text like ''%' + @keyword1 + '%'' 
and c.text like ''%' + @keyword2 + '%'' 
end 
' 
exec sp_msforeachdb @cmd1 
select * from #t 
drop table #t 
+0

非常好。你会认为像这样的东西会被内置到服务器中。 – Trabumpaline

+0

实际上也有这个视图:sys.sql_expression_dependencies列出解析可编程对象时发现的依赖关系。但是我遇到了这个vew缺少的依赖关系。我的理论是,在向表中删除/添加列时,某些依赖关系会丢失。 –