0

sp_executesql を使用してストアド プロシージャを呼び出すとエラーが発生するのはなぜですか?

動作しません。

exec sp_executesql N'sp_clnt_regional_experts_territories',
                   N'@action nvarchar(3), @regional_expert_id int,@region_id int,@territory_id int',
                   @action = N'SEL',
                   @regional_expert_id = 2,
                   @region_id = -1,
                   @territory_id = -1

プロシージャまたは関数 'sp_clnt_regional_experts_territories' には、指定されていないパラメーター '@action' が必要です。

正常に動作します:

EXEC sp_clnt_regional_experts_territories                   
     @action = N'SEL',
     @regional_expert_id = 2,
     @region_id = -1,
     @territory_id = -1

ストアド プロシージャは次のとおりです。

ALTER PROCEDURE [dbo].[sp_clnt_regional_experts_territories]
    @action NVARCHAR(3),
    @regional_expert_id INT = -1,
    @region_id INT = -1,
    @territory_id INT = -1
4

3 に答える 3

3

sp_executesql が間違っています。以下のようにフォーマットする必要があります

 DECLARE @SQLString NVARCHAR(500)
 DECLARE @ParmDefinition NVARCHAR(500)
 DECLARE @action nvarchar(3)
 DECLARE @regional_expert_id int
 DECLARE @region_id int
 DECLARE @territory_id INT
 Set @SQLString=N'EXEC sp_clnt_regional_experts_territories @action,
                                             @regional_expert_id ,@region_id   ,@territory_id'

 Set @ParmDefinition='@action NVARCHAR(3),
            @regional_expert_id INT ,
            @region_id INT ,
            @territory_id INT '

EXECUTE sp_executesql
@SQLString,
@ParmDefinition,
@action=N'SEL',
@regional_expert_id=2,
@region_id=-1,
@territory_id=-1

すべてを 1 つのステートメントに直接入力する代わりに、コードをさまざまな部分に分解すると、問題を簡単に見つけることができます。

于 2012-06-14T06:25:35.647 に答える
1

エラーは、sp_executesqlで必要なストアドプロシージャ名の直後にパラメータを含めなかったためです。

exec sp_executesql N'sp_clnt_regional_experts_territories @action,@regional_expert_id ,@region_id   ,@territory_id',
                   N'@action nvarchar(3), @regional_expert_id int,@region_id int,@territory_id int',
                   @action = N'SEL',
                   @regional_expert_id = 2,
                   @region_id = -1,
                   @territory_id = -1
于 2012-06-14T06:58:04.323 に答える
1

sp_executesqlについて@params:

@stmt に埋め込まれたすべてのパラメーターの定義を含む 1 つの文字列です。

(強調を追加)

@stmtしたがって、他の回答で指摘されているように、そこで特定するパラメータは にも記載する必要があります。

于 2012-06-14T07:24:29.287 に答える