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

无需在一个语句中直接输入所有内容,而是将代码分解为不同的部分,这有助于您轻松找到问题。

于 2012-06-14T06:25:35.647 回答
1

sp_executesql@params

是一个字符串,其中包含已嵌入 @stmt的所有参数的定义。

(重点补充)

@stmt因此,正如其他答案所指出的那样,您在那里识别的任何参数也必须在中提及。

于 2012-06-14T07:24:29.287 回答
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 回答