在做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