高手进!困惑已久的存储过程建动态临时表问题
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 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'
[解决办法]
[解决办法]
- 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的单词的。
[解决办法]
[解决办法]
你的那个参数定义的小了,改为varchar(8000)
这样应该就没问题了。
create proc execSql_proc
@sql varchar(8000)
as
[解决办法]
weeklyDate = '20090706'