在做java调用sqlserver存储过程时遇到了各种各样的问题,不过在不懈的努力之下这些问题还是得以解决了。今天总结一下遇到的问题以及解决的方法。
首先调用存储过程的方法大家都很清楚:
String sql="{call dbo.proc_getdata(?)}";//存储过程名以及参数,?为参数占位符。 CallableStatement cstmt=connection.prepareCall(sql); cstmt.setInt(1, 1); ResultSet rs=cstmt.executeQuery();//返回结果集 while(rs.next()){ }
如果这里的dbo.proc_getdata存储过程没有用到临时表或是表变量,获得想要的结果集没有任何问题。但是存储过程里如果用到了临时表或者是表变量,
那么结果就有点出乎预料了。rs总是没有返回值。这是为什么呢?虽然直接也没有找到原因,但是找到了解决的办法。
首先在存储过程的开始和结尾分别加上set nocount on和set nocount off。然后用到临时表的地方使用自动执行sql语句的方式:
if (object_id('dbo.proc_getdata', 'P') is not null) drop proc dbo.proc_getdata go create proc dbo.proc_getdata ( @No int --输入参数 ) as begin set nocount on IF EXISTS(SELECT * FROM TEMPDB..SYSOBJECTS WHERE ID = OBJECT_ID('TEMPDB..#Student')) DROP TABLE #Student --临时表 create TABLE #Student ( NOCD int NOT NULL , Name nvarchar(32) NOT NULL , PRIMARY KEY(NOCD) ) declare @sql1 VARCHAR(8000) set @sql1=' ' set @sql1=' insert into #Student select * from students' exec(@sql1) set nocount off end