为什么在使用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
答案 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}}中提及,正如其他答案所指出的那样。