无法通过使用命名参数来执行存储过程。我执行的SQL Server分析器显示了一个冗长的SQL,其中包含空值。 还有其他方法可以执行存储过程,最好使用spring-jdbc来创建可读的sql,类似于下面的Expected所示?
[我试图使用useInParameterNames和/或不使用ProcedureColumnMetaDataAccess和/或未声明输入参数来构建SimpleJdbcCall,但没有肯定的结果
我的DAO:
SimpleJdbcCall call = new SimpleJdbcCall(dataSource)
.withProcedureName("UpdateSomethingProc");
final SqlParameterSource in = new MapSqlParameterSource()
.addValue(parm1, null)
.addValue(parm2, null)
.addValue(parm3, null)
.addValue(parm4, "1")
.addValue(parm5, "987654321")
...
.addValue(parm21, null);
.addValue(parm22, null);
call.execute(in);
存储的过程定义:
CREATE PROCEDURE [dbo].[UpdateSomethingProc]
@parm1 varchar(16) = NULL,
@parm2 integer = NULL,
@parm3 varchar(16) = NULL,
@parm4 char(3) ,
@parm5 char(18),
@parm6 T_DBID,
@parm7 char(3) ,
@parm8 char(1) ,
@parm9 char(4) ,
@parm10 smallint = 0,
@parm11 char(4) = NULL,
@parm12 char(4) = NULL,
@parm13 smallint = NULL,
@parm14 smallint = NULL,
@parm15 smallint = NULL,
@parm16 smallint = NULL,
@parm17 smallint = NULL,
@parm18 char(4) = NULL,
@parm19 char(4) = NULL,
@parm20 char(4) = NULL,
@parm21 smallint = 0,
@parm22 smallint = 0
期望:使用C ++的旧版应用程序最终以SQL Server Profiler中的以下SQL结尾,因为它显示了参数名称和相应的值,因此更具可读性。
exec dbo.UpdateSomethingProc @param1='0x9',@parm2='1',@parm3='987654321',@parm4='ABC',@parm5='000',@parm6='1',@parm7='505B',@parm8='0',@parm9='999',@parm10='',@parm11='0',@parm12='0',@parm13='0',@parm14='0',@parm15='0',@parm16='2019/11/11 23:54:35',@parm17='HUB',@parm18='0'
Actual:使用Spring Boot的新应用程序最终以SQL Server Profiler中的以下SQL结尾。如您所见,很难读取哪个参数具有哪个值。特别是在进行故障排除时。
exec sp_executesql N'EXEC dbo.UpdateSomethingProc @P0, @P1, @P2, @P3, @P4, @P5, @P6, @P7, @P8, @P9, @P10, @P11, @P12, @P13, @P14, @P15, @P16, @P17, @P18, @P19, @P20, @P21 ',N'@P0 nvarchar(4000),@P1 int,@P2 nvarchar(4000),@P3 nvarchar(4000),@P4 nvarchar(4000),@P5 nvarchar(4000),@P6 nvarchar(4000),@P7 nvarchar(4000),@P8 nvarchar(4000),@P9 smallint,@P10 nvarchar(4000),@P11 nvarchar(4000),@P12 smallint,@P13 smallint,@P14 smallint,@P15 smallint,@P16 smallint,@P17 nvarchar(4000),@P18 nvarchar(4000),@P19 nvarchar(4000),@P20 smallint,@P21 smallint',NULL,NULL,NULL,N'1',N'987654321',N'ABC',N'000',N'2',N'505B',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,N'2019-11-12T00:14:29.859Z',NULL,NULL,NULL,NULL
这是几乎所有ORM都将调出存储的proc(或与此相关的任何其他参数化sql语句的方式)。这将确保显式传递值并使其免受sql注入等的影响。
我不熟悉JDBC,但看起来它具有“准备好的语句”的概念。如果sql的格式对您特别重要,我将使用准备好的语句。...伪代码:
query = connection.preparedStatment('exec sp_MyProc @param1=?, @param2=?');
query.supplyValue(1, value1);
query.supplyValue(2, value2);
query.execute