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

使用Spring SimpleJdbcCall调用带默认参数的SQL Server存储过程报错求助

使用Spring SimpleJdbcCall调用SQL Server带默认参数存储过程的问题

我尝试用Spring的SimpleJdbcCall调用SQL Server中带有默认值参数的存储过程,未提供该默认参数时执行失败并报错,希望排查代码问题。使用的数据库为SQL Server。

目标存储过程

CREATE PROCEDURE createUser
    @address varchar(250) = NULL,
    @name varchar(25) ,
    @Id numericid = 0 OUTPUT
AS
BEGIN
    INSERT INTO TCustomer (name, address) 
    VALUES (@name, @address)

    SELECT @Id = id 
    FROM TCustomer 
    WHERE name = @name AND address = @address

    SELECT @Id

    RETURN 0    
END

尝试的实现方式及报错

场景1:使用withNamedBinding(),输入变量名带@符号

public int createUser(){
        SimpleJdbcCall spCall = new SimpleJdbcCall(jdbcTemplate)
                .withProcedureName("createUser")
                .withSchemaName("dbo")
                .withoutProcedureColumnMetaDataAccess()
                .useInParameterNames("@name")
                .withNamedBinding()
                .declareParameters(new SqlParameter("@name", Types.VARCHAR),
                        new SqlOutParameter("@Id", Types.NUMERIC));
      Map<String, Object> in = new HashMap<>();
      in.put("name","Rahul");

      Map<String, Object> retValue = spCall.execute(in);
}

报错信息:org.springframework.dao.InvalidDataAccessApiUsageException: 必填输入参数'@name'缺失。

场景2:使用withNamedBinding(),输入变量名不带@符号

public int createUser(){
        SimpleJdbcCall spCall = new SimpleJdbcCall(jdbcTemplate)
                .withProcedureName("createUser")
                .withSchemaName("dbo")
                .withoutProcedureColumnMetaDataAccess()
                .useInParameterNames("name")
                .withNamedBinding()
                .declareParameters(new SqlParameter("name", Types.VARCHAR),
                        new SqlOutParameter("Id", Types.NUMERIC));

      Map<String, Object> in = new HashMap<>();
      in.put("name","Rahul");

      Map<String, Object> retValue = spCall.execute(in);
}

报错信息:org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback; SQL语法错误 [{call createUser(name => ?, Id => ?)}]; 嵌套异常为java.sql.SQLException: 参数索引1无效。

场景3:不使用withNamedBinding(),输入变量名不带@符号

public int createUser(){
        SimpleJdbcCall spCall = new SimpleJdbcCall(jdbcTemplate)
                .withProcedureName("createUser")
                .withSchemaName("dbo")
                .withoutProcedureColumnMetaDataAccess()
                .useInParameterNames("name")
                .declareParameters(new SqlParameter("name", Types.VARCHAR),
                        new SqlOutParameter("Id", Types.NUMERIC));

      Map<String, Object> in = new HashMap<>();
      in.put("name","Rahul");

      Map<String, Object> retValue = spCall.execute(in);
}

报错信息:org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback; SQL语法错误 [{call TCustomer(?, ?)}]; 嵌套异常为java.sql.SQLException: 形式参数"@name"未声明为OUTPUT参数,但传入的实际参数要求输出。

场景4:不使用withNamedBinding(),输入变量名带@符号

public int createUser(){
        SimpleJdbcCall spCall = new SimpleJdbcCall(jdbcTemplate)
                .withProcedureName("createUser")
                .withSchemaName("dbo")
                .withoutProcedureColumnMetaDataAccess()
                .useInParameterNames("@name")
                .declareParameters(new SqlParameter("@name", Types.VARCHAR),
                        new SqlOutParameter("@Id", Types.NUMERIC));

      Map<String, Object> in = new HashMap<>();
      in.put("name","Rahul");

      Map<String, Object> retValue = spCall.execute(in);
}

报错信息:org.springframework.dao.InvalidDataAccessApiUsageException: 必填输入参数'@name'缺失。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 10:32:22