求助:按时间排序的存储过程分页问题
我看过一些存储过程分页的例子,都是基于唯一字段来排序的,但我现在的需求是要根据datetime字段来排序,而表中的datetime字段与其唯一id字段并无关系。这就有点麻烦了,不能简单地通过获得开始、结束id来select某一行集。我想过用表变量,但由于表变量不支持insert into ... select ... 或select ... into ...的格式,再加上我需要传入表名参数使该存储过程能实现共用,因此表变量这个思路似乎行不通。而如果改用临时表,开销又太大了,失去了实质意义。
哪位朋友有较好的解决方法?
问题点数:100、回复次数:8Top
1 楼skxcall()回复于 2003-09-01 11:53:31 得分 0
这就有点麻烦了Top
2 楼pengdali()回复于 2003-09-01 11:55:19 得分 10
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
3 楼txlicenhe(马可)回复于 2003-09-01 11:58:36 得分 40
1:可以用表变量
declare @a varchar(10)
set @a = 'abc'
exec ('Select * into ' + @a + ' from sysprocesses order by spid')
select * from abc
2:
可以生成一个新的唯一字段来排序
select identity(int,1,1),* into #tmp from 表
再对#tmp进行分页处理。Top
4 楼skxcall()回复于 2003-09-01 12:05:35 得分 0
使用临时表不是很占内存吗!Top
5 楼hjhing(winding)回复于 2003-09-01 12:06:54 得分 50
----比如是第6页(每页面10条记录)
select top 10 * from yourTable
where [ID] in (select top 60 [id] from yourTable order by [datetimeF])
and [ID] not in(select top 50 [id] from yourTable order by [datetimeF])
order by datetimeF
-----然后你将以上语句用exec(@str)的形式根据输入参数生成SATRING然后执行即可
-----同用#虚拟表一样,效果不会很好,尤其是页码很大时
-----但你的需求决定了如果你的数据量很大时,必定造成效率降低Top
6 楼hjhing(winding)回复于 2003-09-01 12:08:31 得分 0
-----使用临时表不是很占内存吗!
不要绝对排弃虚拟表!Top
7 楼iamtrueman()回复于 2003-09-01 14:08:32 得分 0
to txlicenhe:
不能用表变量,因为表变量与传入的表名参数无法同时合成exec()的@str。类似exec ('Select * into @表变量 from ' + @传入表名 + ' order by spid')的形式是行不通的。至于新建一唯一字段,由于用到了临时表,不适合我的大数据量要求。
Top
8 楼iamtrueman()回复于 2003-09-01 15:25:48 得分 0
to hjhing:
用in太消耗资源了吧?Top



