You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot调用SQL Server存储过程报错:参数2未设置

问题分析与解决方案

问题原因

你的存储过程定义的是单一OUT参数,但Spring Data JPA的@Procedure注解在处理输出参数时,会将输入参数和输出参数分别映射为两个独立参数,导致生成{call validateCustomer(?,?)}这样的调用语句,而第二个参数(输出参数)未被赋值,从而触发参数未设置的错误。

另外,从存储过程逻辑来看,你实际需要的是INOUT参数(既接收输入值,又返回结果),而非单纯的OUT参数。

解决方案

方案1:修改存储过程为INOUT参数

将存储过程的参数类型从out改为inout,使其同时支持输入和输出:

ALTER procedure [dbo].[VALIDATECUSTOMER]
    @customer nvarchar(max) inout
as
    set @customer = @customer
    select @customer as customer

同步调整Repository注解,明确参数模式:

@Repository
public interface CustomerRepository extends JpaRepository<Customer, BigInteger> {
    @Procedure(procedureName = "VALIDATECUSTOMER")
    String validateCustomer(@Param("customer") @ParameterMode(ParameterMode.INOUT) String customer);
}

方案2:用@Query直接构造调用语句

如果不想修改存储过程,可通过@Query手动构造调用逻辑,避免Spring Data JPA自动生成多余参数:

@Repository
public interface CustomerRepository extends JpaRepository<Customer, BigInteger> {
    @Query(value = "{call VALIDATECUSTOMER(?1)}", nativeQuery = true)
    String validateCustomer(@Param("customer") String customer);
}

方案3:改为返回结果集(可选)

若仅需返回传入值,可将存储过程改为直接返回结果集,舍弃OUT参数:

ALTER procedure [dbo].[VALIDATECUSTOMER]
    @customer nvarchar(max)
as
    select @customer as customer

对应Repository方法调整为:

@Repository
public interface CustomerRepository extends JpaRepository<Customer, BigInteger> {
    @Query(value = "exec VALIDATECUSTOMER :customer", nativeQuery = true)
    String validateCustomer(@Param("customer") String customer);
}

验证

修改完成后重新调用API,生成的调用语句会匹配存储过程参数数量,参数未设置的错误将被解决。

内容的提问来源于stack exchange,提问作者lewis machilika

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 13:10:32