我正在尝试调用存储过程,其名称通过循环表提供。存储过程在另一个数据库中。
但是,我一直收到消息
过程或函数'sp_KPI_People_Added_Count'需要参数 '@ Period',未提供。
但它正在供应。</ p>
我已将语句和参数定义设置为NVarChar
,并以N
为前缀。我也在参数本身上尝试了这一点,但显然这不是必需的。
所有打印输出都是预期的,如果我用文本调用执行,它可以正常工作。
所以我被困住了。任何指针都会受到热烈欢迎。
谢谢,
克里斯。
Declare @KPI_Value Decimal(14,4)
Declare @StoredProcedure NVarChar(200)
Declare @Periodic Char(1)
Declare @ExecSql NVarChar(200)
Declare @ParameterDefinition AS NVarChar(200)
Declare KPI_Cursor CURSOR LOCAL FOR
SELECT SProc, Periodic from KPI where Section = 2
FOR UPDATE OF Current_Value
Open KPI_Cursor
Fetch Next From KPI_Cursor into @StoredProcedure, @Periodic
Declare @Required_Period VARCHAR(5)
SET @Required_Period='MTD'
While @@FETCH_STATUS = 0 BEGIN
Set @KPI_Value = 0 -- Have tried with and without this
If @Periodic = 'Z' BEGIN
SET @ExecSQL = N'Prod.dbo.' + @StoredProcedure;
/* Specify Parameter Format */
SET @ParameterDefinition = N'@Period VarChar(5), @Result_Type VarChar(10), @Result Decimal(14,4) OUTPUT';
/* Execute Transact-SQL String */
print @ExecSQL
print @ParameterDefinition
print @Required_Period
print @KPI_Value
EXECUTE sp_executesql @ExecSQL, @ParameterDefinition, @Required_Period, 'Result', @KPI_Value Output
END
Fetch Next from KPI_Cursor into @StoredProcedure, @Periodic
END
Close KPI_Cursor
Deallocate KPI_Cursor
存储过程的参数如下:
ALTER PROCEDURE [dbo].[sp_KPI_People_Added_Count]
@Period VarChar(5), -- MTD or YTD
@Result_Type VarChar(10), -- Summary, Result or Detail
@Result Decimal(14,4) OUTPUT -- The returned result
AS
....
输出如下:
Prod.dbo.sp_KPI_People_Added_Count
@Period VarChar(5),@ Result_Type VarChar(10),@ Result Decimal(14,4)OUTPUT
MTD
0.0000
消息201,级别16,状态4,过程sp_KPI_Cust_Added_Count,行0
过程或函数'sp_KPI_People_Added_Count'需要参数'@Period',这是未提供的。
答案 0 :(得分:5)
另一种方式......
EXEC使用的格式很少EXEC @module_name_var
所以你可以这样做
If @Periodic = 'Z' BEGIN
SET @module_name_var = N'Prod.dbo.' + @StoredProcedure;
EXEC @module_name_var @Required_Period, 'Result', @KPI_Value Output
END
关于原始代码的一个观察......
使用N'Result'
作为第二个参数。 sp_executesql说(我的大胆)
[@ param1 =]'value1'
是参数字符串中定义的第一个参数的值。值可以是 Unicode常量或Unicode变量。必须为stmt中包含的每个参数提供参数值。