调用动态SQL Server存储过程 - 期望未提供的参数

时间:2011-12-29 09:24:59

标签: sql-server stored-procedures

我正在尝试调用存储过程,其名称通过循环表提供。存储过程在另一个数据库中。

但是,我一直收到消息

  

过程或函数'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',这是未提供的。

1 个答案:

答案 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中包含的每个参数提供参数值。