Louis Davidson
Check this out. It only handles three parms, but it certainly could be made to handle more:
create procedure buildParms
(
@procName nvarchar(128),
@parm1 varchar(max),
@parm2 varchar(max),
@parm3 varchar(max)
) as
begin
set nocount on
select 'DECLARE @retval int'
union all
select ' ,' + parameters.name + ' ' + types.name +
case
when types.name like 'n%char' then '(' + cast(parameters.max_length /2 as varchar(10)) + ')'
when types.name like '%char' then '(' +cast(parameters.max_length as varchar(10)) + ')'
when types.name like '%binary' then '(' +cast(parameters.max_length as varchar(10)) + ')'
when types.name = 'numeric' then '(' + cast(parameters.precision as varchar(10)) + ',' + cast(parameters.scale as varchar(10)) + ')'
else '' end
from sys.parameters
join sys.types
on types.user_type_id = parameters.user_type_id
where object_name(object_id) = @procName
union all
select ' '
union all
select 'SET ' + parameters.name + ' = ' +
case when types.name like '%char' then '''' else '' end +
case parameters.parameter_id --to add more parms, add to this list
when 1 then @parm1
when 2 then @parm2
when 3 then @parm3
end +
case when types.name like '%char' then '''' else '' end
from sys.parameters
join sys.types
on types.user_type_id = parameters.user_type_id
where object_name(object_id) = @procName
union all
select ' '
union all
select 'EXECUTE @retval = ' + @procName
union all
select ' ' + parameters.name + ' = ' + parameters.name
+ case when parameters.is_output = 1 then ' OUTPUT ' else '' end +
case when parameter_id <> (select max(parameter_id) from sys.parameters where object_name(object_id) = @procName)
then ',' else '' end
from sys.parameters
join sys.types
on types.user_type_id = parameters.user_type_id
where object_name(object_id) = @procName
end
go
--test with this proc
alter procedure test$paramTest
(
@value1 int,
@value2 nvarchar(10) output,
@value3 numeric (6,2)
) as
select @value1, @value2, @value3
go
Execute this
buildParms 'test$paramTest','1','x','200'
returns:
DECLARE @retval int
,@value1 int
,@value2 nvarchar(10)
,@value3 numeric(6,2)
SET @value1 = 1
SET @value2 = 'x'
SET @value3 = 200
EXECUTE @retval = test$paramTest
@value1 = @value1,
@value2 = @value2 OUTPUT ,
@value3 = @value3