我需要将程序的acutal参数值存储到临时表中。 我试图创建一个可以应用于不同存储过程的脚本,因此脚本不能包含参数的名称。 出于格式化原因,我无法添加scipt。让我用语言解释。
我有一个带有ParameterName和ParameterValue列的临时表
我使用表格sys.parameters
插入了参数名称
在SP中,我尝试使用调用SP的参数值更新临时表ParameterValue。
我逐个为每个参数创建了动态SQL,我使用@ParameterName变量来保存行中的参数
但是我无法将参数的值(@ParameterName中给定参数的名称)添加到动态SQL
还尝试了SP_EXECUTESQL
请帮助解决这个问题。
答案 0 :(得分:0)
如果使用动态查询而不是#temp表,请使用## temp table或permanent table。这可以解决您的问题。
答案 1 :(得分:0)
这将为您提供所有程序,参数及其参数类型。如果你想要它成为一个临时你可以删除注释掉的部分。此外,如果您只想要一个过程,那么您可以set @ProcName
到该过程的名称。
declare @ProcName varchar(4000) = null
select
o.name as ProcName,
p.name as ParamName,
t.name as ParamType
--into #someTemp
from
sys.objects o
inner join
sys.parameters p on p.object_id = o.object_id
inner join
sys.types t on t.system_type_id = p.system_type_id
where
o.type = 'P'
and @ProcName is null or o.name = @ProcName
根据您的评论进行更新
---------------------------------------------------------
--create a global temp
--Remember SQL will clean up (remove) your temp when it wants
---------------------------------------------------------
create table ##someTemp(
DT datetime,
ProcName varchar(256),
ParamName varchar(128),
ParamType varchar(128),
Val varchar(256))
go
---------------------------------------------------------
--create the procedure
---------------------------------------------------------
create procedure [dbo].[usp_test_param_insert] (@int char(1), @someString varchar(256))
as
insert into ##someTemp (DT,ProcName,ParamName, ParamType, val) values
(getdate(),'usp_test','@int','int',@int),
(getdate(),'usp_test','@someString','varchar(256)',@someString)
select @int, @someString
GO
---------------------------------------------------------
--call the proc a few times... i put the delay so you
--can see the time stamp changing
---------------------------------------------------------
exec usp_test_param_insert 1,'first string'
WAITFOR DELAY '00:00:05'
exec usp_test_param_insert 2,'second string'
WAITFOR DELAY '00:00:05'
exec usp_test_param_insert 3,'third string'
---------------------------------------------------------
--See your results
---------------------------------------------------------
select * from ##someTemp