【问题标题】:How to pass stored procedure's parameter values to temp table using MS SQL 2005?如何使用 MS SQL 2005 将存储过程的参数值传递给临时表?
【发布时间】:2016-12-31 12:46:38
【问题描述】:

我需要将程序实际参数值存储到临时表中。 我试图创建一个可以应用于不同存储过程的脚本,因此该脚本不能包含参数的名称。 由于格式原因,我无法添加 scipt.让我用文字解释一下。

我有一个临时表,其中包含 ParameterName 和 ParameterValue 列 我使用表 sys.parameters 插入了参数名称 在 SP 中,我尝试使用调用 SP 的参数值更新临时表 ParameterValue。 我为每个参数一一创建动态 SQL,我使用 @ParameterName 变量将参数保存在行中 但是我不能将参数的值(@ParameterName 中给定参数的名称)添加到动态 SQL

也试过 SP_EXECUTESQL

请帮忙解决这个问题。

【问题讨论】:

  • 您可能传递的参数数量不正确
  • 愚蠢,但是如何为问题添加代码。无论我做什么,我总是得到错误按摩。有不允许使用的特殊字符吗?谢谢
  • 格式化帮助 - stackoverflow.com/editing-help
  • 也检查了daringfireball.net/projects/markdown/syntax#code,把代码放在
    之间,用了"但还是报错。
  • 否则 EXEC('SELECT ' + @ParameterName) 给出 必须声明标量变量“@ClientCode”(@ClientCode 是行中的参数)。我无法为@ClientCode 声明,因为这是为存储过程本身声明的参数。

标签: sql stored-procedures sql-server-2005 parameters


【解决方案1】:

如果您使用动态查询,而不是#temp 表,请使用##temp 表或永久表。这可能会解决您的问题。

【讨论】:

  • 我用了##。基本问题是我无法获取参数的值,因为参数的名称也在变量(@ParameterName)中
【解决方案2】:

这将为您提供所有过程、它们的参数和它们的参数类型。如果你想把它变成临时文件,你可以删除注释掉的部分。此外,如果您只想要一个程序,那么您可以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

【讨论】:

  • 谢谢。这是第一步,我明白了。但是,目标是添加参数的当前值(调用存储过程时使用的参数值)。
  • 变量名在@ParameterName
猜你喜欢
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
  • 1970-01-01
  • 1970-01-01
  • 2019-05-30
  • 1970-01-01
相关资源
最近更新 更多