我在程序中执行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();
如果我把这两句合并再一起去执行是不出错的,
还有,我把这两句放在数据库查询分析器中也是正常执行的。
请问是我没设置某个选项?还是写的语句有问题?请高人指点?
问题终于被解决了,首先,谢谢各位的回答!
这里有解决问题的答案,这也恰好解释我的方法也有sqlParameter参数而且也是在创建临时表之前,所以执行出错。也解释了我们之前项目没有sqlparamerter参数可以正确执行的原因。
问题原因大概是这个意思:如果该命令有任何参数,底层代码发出的“exec sp_executesql”命令,而这个命令大家都知道,创建的临时表在该语句结束时被删除,如果清除命令参数,底层代码发出一个更直接的“CREATE TABLE”,所以就可以解决这一切了。
如果哪位园友遇到了这样的问题,希望可以帮助你!
没找到对象 啊哈哈~ ,说笑了 你干嘛不把
select * from #Ufida_WBBuffers
放到第一个sql语句里面呢
第二句,我只是用来测试说明问题的,方法后面还有很多语句用到这个临时表,提示对象名‘#Ufida_WBBuffers’无效!
@忽而今夏: 可能是临时表没成功创建,既然其他地方都用 为啥不用视图呢
@alone__: 哦 说错了,是创建视图 ,其实我怀疑跟#有关系 你试试把#去掉 啊哈哈~
@alone__: 我是跟踪用友U8单据来写的方法,所以没有使用视图
上一个语句执行完了,所生成的临时表也就被删除了吧,下一句当然找不到了
本地临时表的名称以单个数字符号 (#) 打头;它们仅对当前的用户连接是可见的;当用户从 Microsoft SQL Server 2000 实例断开连接时被删除。
断开连接后sqlserver会自动删除临时表,你2条sql是使用的同一个connection吗?
你可以将这2个sql 写到一个存储过程里
你好!
我在方法中创建了一个连接对象,所有的sql语句都使用那一个连接对象,我是跟踪用友U8单据来写的方法,所以有很多像这样的sql语句。我们之前也有这样的项目(也是这样使用临时表),好像没有提示对象名无效这个问题!
想在后续会话中使用前次会话中创建的临时表,请使用##全局临时表!
你好,谢谢你的回答
使用全局临时表,应该可以解决这个错误,但是如果多个用户同时调用一个方法,会不会出现冲突呢!
本地临时表(#)不是当连接关闭时被删除吗?还有一点我们之前的项目,也是同样的语句,但却可以正确执行。
这是作用域问题。既然是临时表,那么只能在本次回话中使用,如果要跨回话使用,那么使用全局临时表##申明。
这个是局部变量和全局变量的区别。