sp_executesql错误?

时间:2012-06-14 05:56:18

标签: sql sql-server tsql

为什么在使用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

3 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分:1)

sp_executesql@params

  

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

(强调补充)

所以,你在@stmt中提到的任何参数也必须在{{1}}中提及,正如其他答案所指出的那样。