今天实现一个的功能,要在首要展示不同数据表的统计数据,于是想到了用存储过程通过不同的select语句实现各种统计数据,然后通过多个输出参数获取不同的统计数据,但是却出现了下面的异常:
com.microsoft.sqlserver.jdbc.SQLServerException: 该语句没有返回结果集
我用JdbcTemplate调用SQL server的存储过程的一部分代码如下:
Map<String, Object> outArgInfo = new HashMap<String,Object>();
// 向输出参数 Map 中添加输出参数信息,key 是存储过程对应输出参数名称,值是 java.sql.Types 中的成员变量
outArgInfo.put("zysl", Types.INTEGER);
outArgInfo.put("dtzl", Types.INTEGER);
outArgInfo.put("r", Types.INTEGER);
outArgInfo.put("c1", Types.INTEGER);
outArgInfo.put("gqwj", Types.INTEGER);
outArgInfo.put("dtsydw", Types.INTEGER);
outArgInfo.put("dtwbqys", Types.INTEGER);
outArgInfo.put("olddt", Types.INTEGER);
outArgInfo.put("yhsbl", Types.INTEGER);
outArgInfo.put("jysb", Types.INTEGER);
outArgInfo.put("jybgs", Types.INTEGER);
outArgInfo.put("fxwts", Types.INTEGER);
// 执行存储过程,返回值为将结果集包装的 List,输出参数值直接返回到 outArgInfo
//param1:存储过程名称
//param2:输出参数 Map 对象
//param3-n:输入参数与其值,如 "id",1,"name","zhang",...
ProcTemplateUtil procTemplateUtil=new ProcTemplateUtil(jdbcTemplate);
List list = procTemplateUtil.exec("index_data", outArgInfo, "town_names", rank);
注:ProcTemplateUtil 是一个TemplateUtil调用sqlserver的工具类具体详情可点击查看
后来在网上找到了一个解决办法:
在sql语句前面加上"SET NOCOUNT ON".
但是不管我在JdbcTemplate调用语句里加"SET NOCOUNT ON",还是在存储过程里加"SET NOCOUNT ON"都不行,还是报这个异常.
后来我在存储过程select了所有的输出参数才解决,如下:
ALTER PROCEDURE [dbo].[index_data]
@town_names varchar(200),
@zysl int output,
@dtzl int output,
@r int output,
@c1 int output,
@gqwj int output,
@dtsydw int output,
@dtwbqys int output,
@olddt int output,
@yhsbl int output,
@jysb int output,
@jybgs int output,
@fxwts int output
BEGIN
SET NOCOUNT ON;
--中间是各种语句获取各个输出参数的值
select @zysl as zysl,@dtzl as dtzl,@r as r,@c1 as c1,@gqwj as gqwj,@dtsydw as dtsydw,@dtwbqys as dtwbqys,@olddt as olddt,@yhsbl as yhsbl,@jysb as jysb,@jybgs as jybgs,@fxwts as fxwts;
END
#我觉得可能是JdbcTemplate只接收到select的结果集,而output参数没有接收到(可能是我JdbcTemplate调用存储过程的写法存在问题,欢迎各位指正!)