首页 新闻 会员 周边

Sql server 对象名‘#xx’无效

0
悬赏园豆:10 [已解决问题] 解决于 2013-06-29 12:28

我在程序中执行sql语句,有句创建了一个临时表,执行完成后,再执行一个查询,提示对象名无效‘#xx’无效,请问是什么原因? 这些语句用的是同一个连接对象!

                strSql = "select a.id,autoid ,convert(decimal(30,2),iquantity) as iquantity,convert(decimal(30,2),inum) as iNum, a.Cinvcode,Corufts ,idlsid,iCheckIds, convert(smallint,0) as iOperate into #Ufida_WBBuffers from rdrecords a where 1=0";
                comm.CommandText = strSql;
                comm.ExecuteNonQuery();
                strSql = string.Format("select * from #Ufida_WBBuffers");
                comm.CommandText = strSql;
                comm.ExecuteNonQuery();

如果我把这两句合并再一起去执行是不出错的,

还有,我把这两句放在数据库查询分析器中也是正常执行的。

请问是我没设置某个选项?还是写的语句有问题?请高人指点?

忽而今夏的主页 忽而今夏 | 初学一级 | 园豆:127
提问于:2013-06-28 14:06
< >
分享
最佳答案
0

问题终于被解决了,首先,谢谢各位的回答!

http://stackoverflow.com/questions/11746036/invalid-object-name-for-temporary-table-when-using-command-with-parameters

这里有解决问题的答案,这也恰好解释我的方法也有sqlParameter参数而且也是在创建临时表之前,所以执行出错。也解释了我们之前项目没有sqlparamerter参数可以正确执行的原因。

问题原因大概是这个意思:如果该命令有任何参数,底层代码发出的“exec sp_executesql”命令,而这个命令大家都知道,创建的临时表在该语句结束时被删除,如果清除命令参数,底层代码发出一个更直接的“CREATE TABLE”,所以就可以解决这一切了。

如果哪位园友遇到了这样的问题,希望可以帮助你!

忽而今夏 | 初学一级 |园豆:127 | 2013-06-29 00:36
其他回答(5)
0

没找到对象 啊哈哈~ ,说笑了 你干嘛不把

select * from #Ufida_WBBuffers

放到第一个sql语句里面呢

alone__ | 园豆:60 (初学一级) | 2013-06-28 14:16

第二句,我只是用来测试说明问题的,方法后面还有很多语句用到这个临时表,提示对象名‘#Ufida_WBBuffers’无效!

支持(0) 反对(0) 忽而今夏 | 园豆:127 (初学一级) | 2013-06-28 14:21

@忽而今夏: 可能是临时表没成功创建,既然其他地方都用 为啥不用视图呢 

支持(0) 反对(0) alone__ | 园豆:60 (初学一级) | 2013-06-28 14:25

@alone__: 哦 说错了,是创建视图 ,其实我怀疑跟#有关系 你试试把#去掉 啊哈哈~

支持(0) 反对(0) alone__ | 园豆:60 (初学一级) | 2013-06-28 14:26

@alone__: 我是跟踪用友U8单据来写的方法,所以没有使用视图

支持(0) 反对(0) 忽而今夏 | 园豆:127 (初学一级) | 2013-06-28 17:21
0

上一个语句执行完了,所生成的临时表也就被删除了吧,下一句当然找不到了

happydaily | 园豆:301 (菜鸟二级) | 2013-06-28 15:19

本地临时表的名称以单个数字符号 (#) 打头;它们仅对当前的用户连接是可见的;当用户从 Microsoft SQL Server 2000 实例断开连接时被删除。

支持(0) 反对(0) 忽而今夏 | 园豆:127 (初学一级) | 2013-06-28 17:25
0

断开连接后sqlserver会自动删除临时表,你2条sql是使用的同一个connection吗?

你可以将这2个sql 写到一个存储过程里

收获园豆:5
+小马哥++ | 园豆:906 (小虾三级) | 2013-06-28 15:46

你好!

  我在方法中创建了一个连接对象,所有的sql语句都使用那一个连接对象,我是跟踪用友U8单据来写的方法,所以有很多像这样的sql语句。我们之前也有这样的项目(也是这样使用临时表),好像没有提示对象名无效这个问题!

支持(0) 反对(0) 忽而今夏 | 园豆:127 (初学一级) | 2013-06-28 17:17
0

想在后续会话中使用前次会话中创建的临时表,请使用##全局临时表!

收获园豆:5
邀月 | 园豆:25475 (高人七级) | 2013-06-28 17:55

你好,谢谢你的回答

使用全局临时表,应该可以解决这个错误,但是如果多个用户同时调用一个方法,会不会出现冲突呢!

本地临时表(#)不是当连接关闭时被删除吗?还有一点我们之前的项目,也是同样的语句,但却可以正确执行。

支持(0) 反对(0) 忽而今夏 | 园豆:127 (初学一级) | 2013-06-28 23:23
0

这是作用域问题。既然是临时表,那么只能在本次回话中使用,如果要跨回话使用,那么使用全局临时表##申明。

这个是局部变量和全局变量的区别。

幻天芒 | 园豆:37175 (高人七级) | 2013-06-28 21:13
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册