(本文档仅供参考)
1、SqlServer中新建了多张同名#临时表
2、#临时表作为参数传入存储过程查询出结果
3、在smartbi中查询带#临时表参数的存储过程时会出现字段丢失的情况
有关临时表说明可参考网上的介绍:https://zhuanlan.zhihu.com/p/562721751 |
1、SqlServer以#开头的临时表只会存在于当前数据库连接,如果此连接被释放那么临时表也就消失了。
2、启用连接池后,多张同名临时表的连接在连接池中的可能相同,那么存储过程在连接池获取空闲连接的时候就有可能获取到另一张同名的临时表,导致字段不一致从而丢失。
02-01 16:46:28 ERROR a(smartbi.spreadsheetreport.core.SpreadsheetReportServlet:291) - 获取数据SQL错误<br />获取数据SQL错误:IF OBJECT_ID(&apos;tempdb..#T1&apos;) IS NOT NULL DROP TABLE #T1 CREATE TABLE #T1 (SC VARCHAR(500)) DECLARE @SR VARCHAR(MAX),@JG INT SET @SR= &apos;20221012 20221013 20221014 20221015&apos; +&apos; &apos; SET @JG= 2 SET @SR= REPLACE (@SR,&apos; &apos;,&apos;△&apos;) DECLARE @CS INT,@CS1 INT,@SC1 VARCHAR(5000),@BZ INT SET @SC1=&apos;&apos; SET @BZ=0 SET @CS=0 SET @CS1=-1 WHILE CHARINDEX (&apos;△&apos;,@SR,@CS+1) SET @SC1=SUBSTRING(@SR,@CS+1,@CS1-@CS-1 )+&apos; &apos;+@SC1 SET @CS=@CS1 IF @BZ=@JG OR CHARINDEX (&apos;△&apos;,@SR,@CS+1)=0 BEGIN INSERT INTO #T1 VALUES (@SC1) SET @SC1=&apos;&apos; SET @BZ=0 END END SELECT * FROM #T1;列名或所提供值的数目与表定义不匹配。<br />at smartbi.freequery.querydata.store.DBSQLResultStore.executeInDatabaseInner(DBSQLResultStore.java:1768)<br />at ...(...)<br />at smartbi.log.PreparedStatementWarp.executeQuery(PreparedStatementWarp.java:144)<br />Caused by: java.sql.SQLException: 列名或所提供值的数目与表定义不匹配。<br />at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:368)<br />at net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2820)<br />at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2258)<br />at net.sourceforge.jtds.jdbc.TdsCore.getMoreResults(TdsCore.java:632)<br />at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQLQuery(JtdsStatement.java:477)<br />at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeQuery(JtdsPreparedStatement.java:776)at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:92)<br />at smartbi.log.PreparedStatementWarp.executeQuery(PreparedStatementWarp.java:144)<br />at smartbi.freequery.querydata.store.DBSQLResultStore.runRawSQL(DBSQLResultStore.java:4645)<br />at smartbi.freequery.querydata.store.DBSQLResultStore.executeInDatabaseInner(DBSQLResultStore.java:1706)<br />at smartbi.freequery.querydata.store.DBSQLResultStore.executeInDatabase(DBSQLResultStore.java:1615) |
解决方案
方案一:数据源