2011-12-29 14 views
1

テーブルをループして名前を指定するストアドプロシージャを呼び出そうとしています。ストアドプロシージャは別のデータベースにあります。動的SQL Serverストアドプロシージャを呼び出す - 指定されていないパラメータが必要です

しかし、私はメッセージを得続ける

プロシージャまたは関数 'sp_KPI_People_Added_Countは' パラメータ '@Period'、指定されていません期待しています。

しかし、それは供給されています。

ステートメントとパラメータの定義を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
プロシージャまたはsp_KPI_Cust_Added_Countプロシージャsp_KPI_Cust_Added_Count行0
プロシージャまたは関数 'sp_KPI_People_Added_Count'には、パラメータ '@Period'が指定されていますが、これは指定されていません。

+1

この場合、sp_executesqlは必要ありません。 – gbn

+1

sp_ –

答えて

5

別の方法...

EXECだから、あなたの元のコードについては、この

If @Periodic = 'Z' BEGIN 
    SET @module_name_var = N'Prod.dbo.' + @StoredProcedure; 
    EXEC @module_name_var @Required_Period, 'Result', @KPI_Value Output 
END 

一つの観察を行うことができ、ほとんど使用されるフォームEXEC @module_name_var

を持っている...

2番目のパラメータにN'Result'を使用します。 sp_executesql

は、パラメータ文字列で定義されている最初のパラメータの値です(私の太字)

[@のparam1 =] 'VALUE1' と言います。値はUnicode定数またはUnicode変数です。 stmtに含まれるすべてのパラメータにパラメータ値が指定されている必要があります。

+0

で始まるプロシージャに名前を付けることはお勧めできません。宣言への変更は役に立ちませんでしたが、上記のようにExecだけを使用しました。大変ありがとうございますが、私はなぜ他のフォームがうまくいかないのか分かりません。 – Chris

+0

@Chris:なぜかどちらか分かりません。シンプルなDMLを実行するのではなく、ストアドプロシージャを呼び出すので – gbn

関連する問題