读书人

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

发布时间: 2012-03-15 11:50:38 作者: rapoo

高手进!困惑已久的存储过程建动态临时表问题
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 execSql_proc@sqlvarchar(500)asbeginIFEXISTS (SELECT*FROM #t)begindroptable #texec@sqlendelseexec@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'



报错:

服务器: 消息 2812,级别 16,状态 62,行 12
未能找到存储过程 'insert into  test select  accountName,WDName  from viewDisplayInfo v,rate r
where  bibie = r.rateId and inout = 1 and ZHID = 1'。

存储过程是有的,我已经创建执行了,奇怪


[解决办法]
SQL code
exec @sql -----> exec(@sql)
[解决办法]
你先按照9楼写的试试
如果不行 把九楼里的临时表 换成实际表

注意我在9楼写
'select accountName,WDName from viewDisplayInfo v,rate r bibie = r.rateId and inout = 1 and ZHID = 1'
into已经没了。。
[解决办法]
你得在存储过程里先建立临时表,然后再执行你的那个语句向里插入应该不会有问题。
另外,局部临时表的生命周期在存储过程结束后就终止了。
可以考虑用全局临时表。
[解决办法]
存储过程里面不能用go关键字
[解决办法]
SQL code
alter proc execSql_proc   @sql varchar(500)asbegin   IF  object_id('tempdb..##t') is not null      drop table tempdb..##t   exec (@sql) end goexec execSql_proc 'select accountName,WDName into  ##t   from viewDisplayInfo v,rate r where  bibie = r.rateId     and inout = 1     and ZHID = 1'
[解决办法]
SQL code
--在SQL 变量里,两个''代表1个'--try:declare @str varchar(100),@str1 varchar(100),@sql varchar(8000)--先建全局临时表,再插入。create table ##tb(.............)set @sql='select accountName,WDName ,(month0_Amount * r.rateNumber)/10000  month0_Amount,(month1_Amount * r.rateNumber)/10000  month1_Amount,(month2_Amount * r.rateNumber)/10000  month2_Amount,(month3_Amount * r.rateNumber)/10000  month3_Amount,(month4_Amount * r.rateNumber)/10000  month4_Amount,(month5_Amount * r.rateNumber)/10000  month5_Amount,(month6_Amount * r.rateNumber)/10000  month6_Amount,(select (weeklyAmount * r.rateNumber)/10000  from accountWeekly aw  where weeklyDate = ''' + @str + ''' and aw.accountId = v.accountId )  ['+@str+'_name],(select (weeklyAmount * r.rateNumber)/10000  from accountWeekly aw  where weeklyDate = ''' + @str1 + ''' and aw.accountId = v.accountId ) ['+@str1+'_name] from viewDisplayInfo v,rate r where  bibie = r.rateId and inout = 1 and ZHID = 1'insert ##tb exec createTemp_proc @sql
[解决办法]
可能一个单词,被分成2行了,你再找找含有a的单词的。
[解决办法]
探讨
可能一个单词,被分成2行了,你再找找含有a的单词的。

[解决办法]
你的那个参数定义的小了,改为varchar(8000)
这样应该就没问题了。
create proc execSql_proc
@sql varchar(8000)
as

[解决办法]
weeklyDate = '20090706'

读书人网 >SQL Server

热点推荐