临时表操作的一些见解

转载 2006年06月12日 09:50:00
本人在调试以下存储过程中遇到了很大的困扰(主要是临时表操作):

 

CREATE PROCEDURE [c_readtop] @eachrow int=10 AS
declare @tmpcat varchar(16)
create table #tmp_result (arid int,cat2 varchar(16),title varchar(100),upday datetime)
declare rt_cursor cursor
for select cat2 from category where cat1='电脑手册' and catl=2
open rt_cursor
fetch from rt_cursor into @tmpcat
while @@fetch_status=0
Begin
set rowcount @eachrow
Insert into #tmp_result (arid,cat2,title,upday) Select top 10 arid,cat2,title,upday from article as a
left join category as b on a.sortid=b.catid where b.cat1='电脑手册' and b.cat2=@tmpcat order by upday desc
fetch from rt_cursor into @tmpcat
End
select * from #tmp_result
drop table #tmp_result
close rt_cursor
deallocate rt_cursor

此存储过程的作用是取出每个分类的最新10条记录。
出现的错误信息是(一旦操作返回的记录集时就出现):
ADODB.Recordset 错误 '800a0e78'

The operation requested by the application is not allowed if the object is closed.

此存储过程能在qa中正常运行且能得到正确结果,使用odbc连接数据库的话,也能得到正确的结果。于是首先怀疑oledb方
式连接没能返回记录集。进行了下面的调试:
(一)加调试标记,在调用记录集前用set rs=rs.nextrecordset测试是不是命中返回的记录集……
(二)由于该过存原来是另一个过程的一部分,怀疑存储过程中有些语句不能同时使用,于是将该过程分离成一个独立的
存储过程,错误依旧。
(三)怀疑调用该过程的Asp有问题,于是重做一个只是调用该存储过程的Asp程序,错误依旧。
(四)将连接方式改为odbc方式连接(建dsn,设sql server的login ID,设权限),该错误消失。重新使用oledb连接,
错误依旧。
(五)怀疑对临时表的数据插入有问题,取消去临时表插入数据,能返回一个空的记录集。
(六)经Bigeagle提示,将临时表建在临时数据库tempdb上,错误依旧
(七)把存储过程中的drop table去掉,在qa中运行该存储过程,观察临时表的生成情况,发现临时表正确生成且有正确
的数据插入,百思不得其解,数据输出到哪了?
(八)经Bigeagle提示create table一句返回了记录集,于是重新在输出记录集前使用多个set rs=rs.nextrecordset(最
多放上了4个),错误提示依旧。
(九)怀疑临时表操作有问题,将临时表改为固定表,不插入数据时返回空记录集,插入记录时仍然提示错误。在记录集
输出前先执行一个或多个set rs=rs.nextrecordset,终于有一次没有提示出错(检测到rs.eof为false),于是才恍然大
悟——不但是create table返回了记录集,而且连insert into语句也返回了记录集,不过该记录集得一种特别的记录集
(没有字段,不能对该记录集进行任何操作——连检测rs.eof都不允许),我在此将它称为特殊的记录集,方便下面引
用。
(十)知道了问题的症结,就马上解决了,在存储过程中不希望返回记录集前执行set nocount on,要返回记录集时,先
执行set nocount off。

也就是改成:

CREATE PROCEDURE [c_readtop] @eachrow int=10 AS
declare @tmpcat varchar(16)
set nocount on
create table #tmp_result (arid int,cat2 varchar(16),title varchar(100),upday datetime)
declare rt_cursor cursor
for select cat2 from category where cat1='电脑手册' and catl=2
open rt_cursor
fetch from rt_cursor into @tmpcat
while @@fetch_status=0
Begin
set rowcount @eachrow
Insert into #tmp_result (arid,cat2,title,upday) Select top 10 arid,cat2,title,upday from article as a
left join category as b on a.sortid=b.catid where b.cat1='电脑手册' and b.cat2=@tmpcat order by upday desc
fetch from rt_cursor into @tmpcat
End
set nocount off
select * from #tmp_result
drop table #tmp_result
close rt_cursor
deallocate rt_cursor

问题解决。


在该存储过程调试过程中,发现oledb和odbc存在一个很大的差别,asp向odbc取记录集时,odbc过滤了上面所称的特
殊记录集(那种只占位置但不能进行任何操作的记录集——多由create table或insert into产生),而asp向oledb取记录
集时,oledb并没有将特殊记录集过滤。
同时,认识到在使用存储过程返回记录集时,在不希望返回记录的地方,应该使用set nocount on禁止存储过程返回
记录集,否则可能会绕很多弯路。
终于明白了为什么绕了这么多弯路:没有想到oledb返回了这么多特殊的记录集(还是由一个循环产生的,该循环执行
次数5、6次),怪不得在取记录集前虽然执行了set rs=rs.nextrecordset,但终因数据不够多而未能发现错误症结所在。
特别感谢在调试过程中bigeagle给予的提示,多谢。

临时表操作的一些见解

本人在调试以下存储过程中遇到了很大的困扰(主要是临时表操作):CREATE PROCEDURE [c_readtop] @eachrow int=10ASdeclare @tmpcat varch...
  • wpc820411
  • wpc820411
  • 2010年10月08日 12:58
  • 395

分桶法

分桶法与平方分割给定一个序列,并询问很多个区间,要求我们求该区间的最值,一般采用的都是ST算法,这边提供一个新的方法——分桶法。相比较ST算法,效率可能没有那么高,ST算法的查询效率是O(lg(n))...
  • qq_34317623
  • qq_34317623
  • 2017年03月16日 23:48
  • 231

thinkphp3.2.3 临时表数据操作

1业务需求: 电商平台需要一台图片服务器管理所有图片,平台系统和商家图片存入这台服务器,而商家信息不能存入这台服务器,而要求相册列表和商家列表连接查询 2:临时表解决: 创建临时表,循环插...
  • a6749920
  • a6749920
  • 2017年02月07日 10:07
  • 1281

临时表经典使用范例

一、SQL SERVER临时表实用大全 引子:        临时数据表格,我们在存储的时候经常遇见。   客户端可以实用Delphi的ClientDataSet的内存表,但是ClientDat...
  • xieyunc
  • xieyunc
  • 2017年08月18日 22:02
  • 1017

临时表操作的一些见解(解决了我在存储过程中使用临时表的困惑)

 本人在调试以下存储过程中遇到了很大的困扰(主要是临时表操作):CREATE PROCEDURE [c_readtop] @eachrow int=10 ASdeclare @tmpcat varch...
  • xieyunc
  • xieyunc
  • 2009年04月27日 20:22
  • 674

oracle两种临时表的创建及使用方法

oracle数据库的临时表可以用来保存一个会话session的数据,或者一个事务中的数据。当查询语句非常复杂时,我们就可以创建一个临时表时保存查询结果,并进行一系列操作。 一、创建临时表 创建...
  • u011921996
  • u011921996
  • 2017年08月23日 15:50
  • 1066

sybase jdbc 创建临时表

//判断临时表是否存在 String pd_l_sql = "select name from tempdb.dbo.sysobjects where name like '#table_name%'...
  • u014136910
  • u014136910
  • 2016年07月08日 11:39
  • 343

Unity3d中lightMap的使用

环境:unity3d4.1,windows8.1 unity3d可以产生较好的光照贴图,在程序中使用它们可以产生较好的效果。 Renderer.lightmapTilingOffset 光照贴图平...
  • kupe87826
  • kupe87826
  • 2015年01月07日 17:08
  • 1470

php+mysql 创建临时数据表

$temp_sql = "create  temporary  table tmp_query (tmp_lid int(11) NOT NULL auto_increment PRIMARY KEY...
  • k8080880
  • k8080880
  • 2011年09月28日 20:41
  • 1890

Java面试准备十八:数据库——临时表、视图

Oracle临时表 Oracle视图 参考Oracle临时表总结 Oracle临时表 Oracle视图说明1. Oracle临时表 临时表概念(1)临时表只在Oracle 8i以上产品中支持。...
  • u013349237
  • u013349237
  • 2017年04月23日 01:15
  • 737
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:临时表操作的一些见解
举报原因:
原因补充:

(最多只允许输入30个字)