パラメータ名に「AS」記号が含まれている場合-機能しない
create procedure ViewParameters
@procedure varchar(50)
as
declare
@w varchar(max),
@p int, @p2 int,
@t varchar(max)
/* Andrey Rubanko 18 jul 2013 */
/* fill temporary table with procedure body */
select @w = definition
from sys.sql_modules
where object_id = object_id(@procedure)
declare @lines table (line varchar(500), id int identity(1, 1))
while len(@w) > 0 begin
set @p = charindex(char(10), @w)
if @p > 0 begin
insert @lines(line) values(replace(replace(SUBSTRING(@w, 1, @p - 1), char(13), ''), char(9), ' '))
set @w = SUBSTRING(@w, @p + 1, 10000)
end else begin
insert @lines(line) values(replace(@w, char(13), ''))
set @w = ''
end
end
/* remove comments */
declare
@i int,
@inCommentNow bit,
@again bit
set @i = 1
set @inCommentNow = 0
while @i <= (select max(id) from @lines) begin
select @w = line from @lines where id = @i
set @again = 0
if @inCommentNow = 0 begin
set @p = patindex('%--%', @w)
if @p > 0 begin
set @w = SUBSTRING(@w, 1, @p - 1)
update @lines
set line = @w
where id = @i
end
set @p = patIndex('%/*%', @w)
if @p > 0 begin
set @p2 = PATINDEX('%*/%', @w)
if @p2 > 0 begin
update @lines
set line = substring(@w, 1, @p - 1) + SUBSTRING(@w, @p2 + 2, 10000)
where id = @i
set @again = 1
end else begin
set @inCommentNow = 1
update @lines
set line = SUBSTRING(@w, 1, @p - 1)
where id = @i
end
end
end
if @inCommentNow = 1 begin
set @p = PATINDEX('%*/%', @w)
if @p > 0 begin
update @lines
set line = SUBSTRING(@w, @p + 2, 10000)
where id = @i
set @inCommentNow = 0
set @again = 1
end else
update @lines
set line = ''
where id = @i
end
if @again = 0
set @i = @i + 1
end
/* remove all except parameters */
declare
@first int,
@last int
set @i = 1
while @last is null begin
select @w = line from @lines where id = @i
if SUBSTRING(@w, 1, 2) = 'as'
set @last = @i - 1
set @p = PATINDEX('% as%', @w)
if @last is null and @p > 0 begin
set @w = SUBSTRING(@w, 1, @p - 1)
update @lines
set line = @w
where id = @i
if charindex('@', @w) > 0
set @last = @i
else
set @last = @i - 1
end
set @p = CHARINDEX('@', @w)
if @first is null and @p > 0 begin
set @first = @i
set @w = SUBSTRING(@w, @p, 10000)
end
set @i = @i + 1
end
delete @lines
where @first is null
or id < @first
or id > @last
/* decode lines to paramters */
declare @par table (ParameterName varchar(50), ParameterType varchar(50), DefaultValue varchar(50))
declare
@name varchar(50),
@type varchar(50),
@default varchar(50)
declare c cursor for
select line
from @lines
open c
fetch next from c into @w
while @@FETCH_STATUS = 0 begin
while len(@w) > 0 begin
set @default = null
set @w = SUBSTRING(@w, charindex('@', @w) + 1, 10000)
set @p = CHARINDEX(',', @w)
print 'start:' + @w
if @p > 0 begin
set @t = SUBSTRING(@w, 1, @p - 1)
set @w = LTrim(RTrim(SUBSTRING(@w, @p + 1, 10000)))
end else begin
set @p = patindex('% as%', @w)
if @p > 0
set @t = SUBSTRING(@w, 1, @p - 1)
else
set @t = @w
set @w = ''
end
print 'T=' + @t
set @p = charindex(' ', @t)
if @p = 0
print 'NameError:' + @t + ' ->' + cast(@p as varchar)
set @name = SUBSTRING(@t, 1, @p - 1)
set @t = SUBSTRING(@t, @p + 1, 10000)
set @p = CHARINDEX('=', @t)
if @p > 0 begin
set @default = Replace(LTrim(RTrim(SUBSTRING(@t, @p + 1, 10000))), '''', '')
set @t = SUBSTRING(@t, 1, @p - 1)
end
set @p = CHARINDEX('(', @t)
if @p > 0
set @type = LTrim(RTrim(SUBSTRING(@t, 1, @p - 1)))
else
set @type = LTrim(RTrim(@t))
insert @par (ParameterName, ParameterType, DefaultValue)
values(@name, @type, @default)
end--while len(@w) > 0
fetch next from c into @w
end
close c
deallocate c
select *
from @par