各位大哥,row_number在2005中存在,但2000中有无类似的函数?

Eallies 2006-12-01 02:48:30
各位大哥,救命啊!!

row_number在2005中存在,但2000中有无类似的函数?

我的程序都是在自己的机器上开发的,自己装的2005,分页时全部用的row_number技术,但上传到服务器上时,发现2000没有这个函数,全部的页面都打不开。

请问,2000中如何写一个自定义的函数,实现同样的功能?万分感谢!!
...全文
255 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
marco08 2006-12-01
  • 打赏
  • 举报
回复
建議用老大的分頁存儲過程
Eallies 2006-12-01
  • 打赏
  • 举报
回复
改动量好大,有些受不了了
fcuandy 2006-12-01
  • 打赏
  • 举报
回复
CREATE PROCEDURE SP_Page

@TB VARCHAR(50),
@COL VARCHAR(50),
@ORDERBY BIT,
@COLLIST VARCHAR(800),
@PAGESIZE INT,
@PAGE INT,
@CONDITION VARCHAR(800),
@RecPages INT,
@RecCount INT OUTPUT,
@PAGES INT OUTPUT,
@OUTSQL NVARCHAR(4000) OUTPUT

AS

DECLARE @SQL NVARCHAR(4000)
DECLARE @WHERE1 VARCHAR(800)
DECLARE @WHERE2 VARCHAR(800)

IF @CONDITION IS NULL OR RTRIM(@CONDITION) = ''
BEGIN
SET @WHERE1=' WHERE '
SET @WHERE2=' '
END
ELSE
BEGIN
SET @WHERE1=' WHERE ('+@CONDITION+') AND '
SET @WHERE2=' WHERE ('+@CONDITION+') '
END

SET @SQL = 'SELECT @RecCount=COUNT(*),@PAGES=CEILING((+0.0)/'+CAST(@PAGESIZE AS VARCHAR)+') FROM '+@TB+@WHERE2

IF @RecPages = 0
EXEC SP_EXECUTESQL @SQL,N'@PAGES INT OUTPUT,@RecCount INT OUTPUT',@PAGES OUTPUT,@RecCount OUTPUT
ELSE
SELECT @PAGES = @RecPages

IF @ORDERBY=0
SET @SQL= 'SELECT TOP '+CAST(@PAGESIZE AS VARCHAR)+' '+@COLLIST+' FROM '+@TB+@WHERE1+@COL+'>(SELECT MAX('+@COL+') '+' FROM (SELECT TOP '+CAST(@PAGESIZE*(@PAGE-1) AS VARCHAR)+' '+
@COL+' FROM '+@TB+@WHERE2+'ORDER BY '+@COL+') t) ORDER BY '+@COL
ELSE
SET @SQL='SELECT TOP '+CAST(@PAGESIZE AS VARCHAR)+' '+@COLLIST+' FROM '+@TB+@WHERE1+@COL+'<(SELECT MIN('+@COL+') '+' FROM (SELECT TOP '+CAST(@PAGESIZE*(@PAGE-1) AS VARCHAR)+' '+
@COL+' FROM '+@TB+@WHERE2+'ORDER BY '+@COL+' DESC) t) ORDER BY '+@COL+' DESC'

IF @PAGE=1
SET @SQL='SELECT TOP '+CAST(@PAGESIZE AS VARCHAR)+' '+@COLLIST+' FROM '+@TB+@WHERE2+'ORDER BY '+@COL+CASE @ORDERBY WHEN 0 THEN '' ELSE ' DESC' END

SET @OUTSQL = @SQL

EXEC(@SQL)

这是以前写的一个分页存储过程.设id为标识

实际上就是
当当前页=1时
select top 页行数 from tb
当前页为n时
select top 页行数 from tb where id>(select max(id) from (select top (n-1)*页行数 id from tb)
比如当前页为5,每页显示10条记录
那么前4页应该显示40条记录, 若以id顺序来排的话, 则第5页显示的记录应该是 id大小排第41至第50的.即取前10条 id>( 前40条记录的最大id)

这种分页算法,页数越靠前越快, 越靠后速度会变慢.
Eallies 2006-12-01
  • 打赏
  • 举报
回复
select top 3 [News].[Unique], [News].[Title], [News].[Create] from [News]
where [News].[Unique] not in
(
select top 30 [News].[Unique] from [News] order by [News].[Create] desc
)
order by [News].[Create] desc

是这样吗?第11页的效果。
Eallies 2006-12-01
  • 打赏
  • 举报
回复
fcuandy(手中无剑,心中亦无)大师,您这么一说,我倒真不敢用了,请问您最常用什么方法的?top n是怎么做到的呢?
fcuandy 2006-12-01
  • 打赏
  • 举报
回复
将实表用作临时表用, 多个进程访问时会混乱,很有问题.


"如果数据量比较大,如10万条,这样的操作是否很占用系统资源"
临时表也是表,如果说资源占用的话,你就当是考滤将一个10w记录的表复制到另一个表里, 自己想吧.

你做分页用的话,不一定要用 row_number之类的东西,标识列+ top n 或 count已经能解决问题了.
gc_ding 2006-12-01
  • 打赏
  • 举报
回复
另外,楼主也可以考虑这样用临时表

if object_id('testdb') is not null drop table testdb
select ID=identity(int, 1, 1), * into testdb from tablename
select * from testdb
drop table testdb

这样,就不会存在中途退出程序临时表没有删掉的情况
gc_ding 2006-12-01
  • 打赏
  • 举报
回复
另外,楼主也可以考虑这样用临时表

if object_id('testdb') is not null drop table testdb
select ID=identity(int, 1, 1), * into testdb from tablename
select * from #T
drop table testdb

这样,就不会存在中途退出程序临时表没有删掉的情况
gc_ding 2006-12-01
  • 打赏
  • 举报
回复
楼主如果可以的话让那边也装上SQL2005吧
marco08 2006-12-01
  • 打赏
  • 举报
回复
2、使用临时表有没有需要注意的问题?(抱歉,我从未使用过临时表)
3、如果数据量比较大,如10万条,这样的操作是否很占用系统资源?

--我不是很了解, 樓下續繼
marco08 2006-12-01
  • 打赏
  • 举报
回复
用完以後要刪除
drop table #T
Influence 2006-12-01
  • 打赏
  • 举报
回复
2000中沒有row_number()
Eallies 2006-12-01
  • 打赏
  • 举报
回复
marco08(天道酬勤)
大师,就目前来看,您的方案好像改动比较小些。

1、请问#T就是临时表,对吗?这个表在执行完毕后就会释放掉对吗?
2、使用临时表有没有需要注意的问题?(抱歉,我从未使用过临时表)
3、如果数据量比较大,如10万条,这样的操作是否很占用系统资源?

万分感谢!!
弘毅致远 2006-12-01
  • 打赏
  • 举报
回复
帮顶....
Eallies 2006-12-01
  • 打赏
  • 举报
回复
现在如果不写通用函数,程序的改动势必非常大。
marco08 2006-12-01
  • 打赏
  • 举报
回复
2000中沒有row_number()
可以用臨時表
冷箫轻笛 2006-12-01
  • 打赏
  • 举报
回复
写通用函数,好像有些困难
rea1gz 2006-12-01
  • 打赏
  • 举报
回复


要根据表的结构来具体写
jacobsan 2006-12-01
  • 打赏
  • 举报
回复
设个自增ID
marco08 2006-12-01
  • 打赏
  • 举报
回复
select ID=identity(int, 1, 1), * into #T from tablename

select * from #T
加载更多回复(1)

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧