解析数据库中的存储过程
Parsing stored procedures in a database
有人要求我找出修改字段名称对 table 的影响,然后找出此更改的影响。
虽然识别受影响的 table 非常容易,但我在尝试识别受影响的存储过程时遇到了问题。
我也希望这个脚本也能帮助开发;能够识别所有必要的程序。
我在下面有一些代码创建了一个临时 table,其中包含一个过程名称和一个包含过程文本 (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 有问题。
任何人都可以推荐修复或更好的解决方案。
我写了一篇关于此的博客 post:
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
有人要求我找出修改字段名称对 table 的影响,然后找出此更改的影响。
虽然识别受影响的 table 非常容易,但我在尝试识别受影响的存储过程时遇到了问题。
我也希望这个脚本也能帮助开发;能够识别所有必要的程序。
我在下面有一些代码创建了一个临时 table,其中包含一个过程名称和一个包含过程文本 (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 有问题。
任何人都可以推荐修复或更好的解决方案。
我写了一篇关于此的博客 post: 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