存储过程的执行显示了冗长的SQL

问题描述 投票:0回答:1

无法通过使用命名参数来执行存储过程。我执行的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
java sql-server spring-jdbc simplejdbccall
1个回答
1
投票

这是几乎所有ORM都将调出存储的proc(或与此相关的任何其他参数化sql语句的方式)。这将确保显式传递值并使其免受sql注入等的影响。

我不熟悉JDBC,但看起来它具有“准备好的语句”的概念。如果sql的格式对您特别重要,我将使用准备好的语句。...伪代码:

query = connection.preparedStatment('exec sp_MyProc @param1=?, @param2=?');

query.supplyValue(1, value1);
query.supplyValue(2, value2);

query.execute
© www.soinside.com 2019 - 2024. All rights reserved.