2015-10-15 61 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缺少的依賴關係。我的理論是,在向表中刪除/添加列時,某些依賴關係會丟失。 –