当前位置: 代码迷 >> Sql Server >> 困惑已久的存储过程建动态临时表有关问题
  详细解决方案

困惑已久的存储过程建动态临时表有关问题

热度:63   发布时间:2016-04-27 19:11:06.0
高手进!困惑已久的存储过程建动态临时表问题
String sqlParam = “select accountName,WDName ,'month0_Amount'=(month0_Amount * r.rateNumber)/10000 ,'month1_Amount'=(month1_Amount * r.rateNumber)/10000 ,'month2_Amount'=(month2_Amount * r.rateNumber)/10000 ,'month3_Amount'=(month3_Amount * r.rateNumber)/10000 ,'month4_Amount'=(month4_Amount * r.rateNumber)/10000 ,'month5_Amount'=(month5_Amount * r.rateNumber)/10000 ,'month6_Amount'=(month6_Amount * r.rateNumber)/10000 ,'20090706'=(select (weeklyAmount * r.rateNumber)/10000 from accountWeekly aw where weeklyDate = '20090706' and aw.accountId = v.accountId ) ,'20090713'=(select (weeklyAmount * r.rateNumber)/10000 from accountWeekly aw where weeklyDate = '20090713' and aw.accountId = v.accountId ) into #t from viewDisplayInfo v,rate r where bibie = r.rateId and inout = 1 and ZHID = 1 order by WDName desc” 
//sqlParam这个语句是自动生成的,要传到存储过程中 
cmd1 = con.prepareCall("{call execSql_proc(?)}"); 
cmd1.setString(1, sqlParam); 
cmd1.execute(); 

报错如下:java.sql.SQLException: 对象名 '#t' 无效。 
java.lang.NumberFormatException: For input string: "null" 

SQL code
--存储过程是个判断执行那条语句 create proc execSql_proc   @sql varchar(5000) as begin   IF EXISTS (SELECT * FROM tempdb.#t )     begin       drop table tempdb.#t        exec @sql     end   else     exec @sql  end 


直接在sql里面执行 exec execSql_proc 'select select accountName,WDName into #t from viewDisplayInfo v,rate r where bibie = r.rateId and inout = 1 and ZHID = 1'会报错:对象名 '#t' 无效 

上面的sqlParam 语句是用程序动态生成的,因为要通过sqlParam动态生成临时表,再在程序里调用临时表生成报表,是不是临时表的生命周期在存储过程结束后就终止了?那样的话再调用临时表生成报表也行不通了?若用##t的话,会不会产生并发操作问题?

试过tempdb.#t和tempdb..#t都不行,好像里面单引号也有冲突

肯请高手帮忙解决

------解决方案--------------------
用全局临时表##t试试
------解决方案--------------------
SQL code
create proc execSql_proc   @sql varchar(5000) as begin   IF EXISTS (SELECT * FROM tempdb.#t )         drop table tempdb.#t     go      exec @sql end
------解决方案--------------------
你把整个过程代码贴一下
------解决方案--------------------
探讨
SQL codecreateproc [email protected](500)asbeginIFEXISTS (SELECT*FROM #t)begindroptable [email protected]@sqlendexec execSql_proc'select accountName,WDName into #t from viewDisplayInfo v,¡­

------解决方案--------------------
SQL code
create proc execSql_proc   @sql varchar(500)asbegin   IF  EXISTS (SELECT * FROM #t)         drop table #t       go       create table #t(accountName varchar(100),WDName varchar(100))        insert into #t        exec @sql     end exec execSql_proc   'select accountName,WDName   from viewDisplayInfo v,rate r bibie = r.rateId and inout = 1 and ZHID = 1'
------解决方案--------------------
SQL code
create proc execSql_proc   @sql varchar(500)asbegin   IF  object_id('#t') is not null         drop table #t       go       create table #t(accountName varchar(100),WDName varchar(100))        go       insert into #t        exec @sql   end exec execSql_proc 'select accountName,WDName from viewDisplayInfo v,rate r bibie = r.rateId and inout = 1 and ZHID = 1'
------解决方案--------------------
探讨
改成实际表执行exec execSql_proc  'insert into  test select  accountName,WDName  from viewDisplayInfo v,rate r where  bibie = r.rateId and inout = 1 and ZHID = 1'
  相关解决方案