关于游标的问题。谢谢回复!
有一个存储结构,其主要为实现如下功能:
(1)针对数据库中的某一个数据表(例如Clients表)建立一个游标;
(2)将游标定位到某条记录上(例如第125条记录);
(3)以该条记录为起始点,将由此向下的25条记录一并以结果集的形式返回给
前台应用;
(4)前台应用将以(ADO.NET---DataReader)读取后台数据库传来的信息;
请问对于这样的一个存储过程,在第三条(3)方面将具体如何实现呢?
谢谢回复!
问题点数:50、回复次数:11Top
1 楼sunsunup(細水長流)回复于 2003-12-02 09:56:49 得分 0
在cursor中, 可以將接下來的25條記錄插入到一個temp表中,再返回不行嗎Top
2 楼realgz(realgz)回复于 2003-12-02 10:01:24 得分 0
暂时只想到楼上的方法。Top
3 楼pengdali()回复于 2003-12-02 10:03:01 得分 0
select IDENTITY(int, 1,1) AS ID_Num,* into #temp from 表
select * from #temp where ID_Num between 10 and 20
Top
4 楼pengdali()回复于 2003-12-02 10:04:23 得分 0
(1)针对数据库中的某一个数据表(例如Clients表)建立一个游标;
(2)将游标定位到某条记录上(例如第125条记录);
declare cursor_insert scroll cursor for select * from 你的表
open cursor_insert
fetch ABSOLUTE 125 from cursor_insert into @xxx
close cursor_insert
deallocate cursor_insertTop
5 楼pengdali()回复于 2003-12-02 10:05:16 得分 20
CREATE PROCEDURE GetProductsPaged
@lastProductID int,
@pageSize int
AS
SET ROWCOUNT @pageSize
SELECT *
FROM Products
WHERE [standard search criteria]
AND ProductID > @lastProductID
ORDER BY [Criteria that leaves ProductID monotonically increasing]
GOTop
6 楼wzh1215(懒猫)回复于 2003-12-02 10:07:57 得分 0
select IDENTITY(int, 1,1) AS ID_Num,* into #temp from 表
declare @current int
exec('select top 25 * from #temp where ID_Num>'+convert(varchar(10),@current))Top
7 楼LoveSQL(努力奋斗ing)回复于 2003-12-02 10:08:32 得分 0
其实你完全可以不用游标
select identity(int,1,1) id ,* into #tmp from clients
select top 25 * from #tmp where id>=125 order by id
这样就行了。
如果非要使用游标,就的每次去一条记录,然后插到一个临时表里,最后
一起返回给前台一个结果集,但是效率不高。Top
8 楼wzh1215(懒猫)回复于 2003-12-02 10:12:25 得分 0
select IDENTITY(int, 1,1) AS ID_Num,* into #temp from 表
declare @current int
set @current=125
exec('select top 25 * from #temp where ID_Num>='+convert(varchar(10),@current))Top
9 楼Rotaxe(程序员)回复于 2003-12-02 10:21:07 得分 30
不用游标,如果表已有id,可用
select top 25 * from clients where [id] not in(select top 125 [id] from clients order by [id]) order by [id]Top
10 楼myblueeye(蓝眼睛)回复于 2003-12-02 11:31:01 得分 0
首先感谢各位的回复及指教!!
仔细阅读了众为位的回复,主要解决途径为两种,其一是建立临时表;其二是针对数据表中的带有ID类型的数据列,用SELECT查询语句输出结果集。
针对这两种类型的解决方法,我仍有些疑问:
首先这个存贮过程主要用于WEB应用中,主要用于所有DataList的自定义分页显示,该过程主要有以下特点:
(1)该存储过程被访问执行的频次非常高,以及会同时有很多的并发访问执行该存储过程;如果采用全局临时表的形式,对于所有并发的访问将不能正常执行,并且会出现对该表访问上的冲突;如果采用本地临时表的形式,理论上将会为每个并发连接在TempDB库中创建一个临时的表,如果并发量大的话,在数据访问性能上将不会允许如此创建,并且在TempDB库中也不允许创建名称重复的临时数据表,因此对于该过程采用临时表好象不可以!
(2)由于WEB应用在运行过程中,将对数据库中有众多个表进行类似的访问,针对每个表都编制一个本帖首项中提到的实现(1)、(2)、(3)功能的存储过程虽然可以可行,但是仅仅是因为数据表名称的不同而不能将所有功能完全一样的存储过程进行整合,好象显得代码比较冗余及重复,因此该存储过程将以参数输入的性质,将每次需要访问的数据表名称输入到过程中,并且采用动态SQL的执行形式为该输入名称的表建立游标,这个功能实现上已经没问题。
至于Rotaxe(程序员) 提出的:
不用游标,如果表已有id,可用
select top 25 * from clients where [id] not in(select top 125 [id] from clients order by [id]) order by [id]
以及 pengdali(大力 V3.0)提出的:
CREATE PROCEDURE GetProductsPaged
@lastProductID int,
@pageSize int
AS
SET ROWCOUNT @pageSize
SELECT *
FROM Products
WHERE [standard search criteria]
AND ProductID > @lastProductID
ORDER BY [Criteria that leaves ProductID monotonically increasing]
GO
正在测试中,希望可以。同时针对这个存储过程的上述两个特点,希望经验丰富的朋友们不吝赐教!!
Top
11 楼ujjcel()回复于 2003-12-02 15:01:29 得分 0
upTop




