如大家要转载,请保留本人的版权:
/*
*Description:SQL数据库数据分页技术
*Auther:chongchong2008-天真的好蓝啊
*MSN:chongchong2008@msn.com
*QQ:154674958
*Blog:chongchong2008.cnblogs.com
*Dates:2010-01-13
*Copyright:ChongChong2008 YiChang HuBei China
*/
说说SQL数据库按照降序排列的情况,如下:
方法一:Select Top Min(Max) Select Top 方法
问题,第一页的时候有bug
问题,不能多字段排序,必须要求主键,即排序字段唯一不能重复,且此主键的类型必须是int类型,如果多字段排序,还要求主键是连续的,不能断裂。
读取第二页数据的基本SQL代码,每页10条数据
如下降序排序:
SELECT TOP 10 * FROM table_test where table_ID<(
SELECT MIN(table_ID) FROM (
SELECT TOP 20 table_ID FROM table_test ORDER BY table_ID DESC
) t
)ORDER BY table_ID DESC
方法二:Select In Select Top 方法
问题,最后一页的时候有bug
问题,要求有主键,即要求一个不能重复的唯一字段,主键的类型可以任意,可以多字段排序,多个字段都可以有自己单独的排序方式
读取第二页数据的基本SQL代码,每页10条数据
如下降序排序:
SELECT * FROM table_test where table_ID in (
SELECT top 10 table_ID FROM (
SELECT TOP 10 table_ID,table_OrderID FROM table_test ORDER BY table_OrderID DESC,table_ID DESC
) t order by table_OrderID ASC,table_ID ASC
)order by table_OrderID DESC,table_ID DESC
如下升序排序:
SELECT * FROM table_test where table_ID in (
SELECT top 10 table_ID FROM (
SELECT TOP 10 table_ID,table_OrderID FROM table_test ORDER BY table_OrderID ASC,table_ID ASC
) t order by table_OrderID DESC,table_ID DESC
)order by table_OrderID ASC,table_ID ASC
第一种方法其实很好,如果你不要求用其他的非主键排序的话,那绝对是你的首选。
不过,在要求非主键字段排序的场合下,就得用上第二种方法了,而且还可以多字段排序,下下主要说说这种排序方法。
这种排序方法要求排序字段的排序方式反转,在你写SQL语句的时候要用到,为了支持多字段的自动反转,下面我写了一个函数,方便调用。
如下:
-- =============================================
-- Description: 反转排序字段的排序方式
-- Author: chongchong2008 - 天真的好蓝啊
-- QQ: 154674958
-- Email: yc_mingzi@tom.com
-- MSN: chongchong2008@msn.com
-- Create Date: 2009-11-13
-- =============================================
ALTER FUNCTION [dbo].[fn_chongchong_ReversOrder]
(
@orderFields nvarchar(255)
)
RETURNS nvarchar(256)
AS
BEGIN
declare @sourceString nvarchar(255)
declare @resultString nvarchar(255)
declare @tempString nvarchar(32)
declare @index int
declare @len int
declare @len2 int
set @sourceString = @orderFields + ',';
--计算长度
set @len = len(@sourceString)
set @index = CHARINDEX(',', @sourceString)
set @resultString = ''
--循环
while(@index!=0)
BEGIN
set @tempString = SUBSTRING(@sourceString, 1, @index-1)
if( CHARINDEX('desc', @tempString) !=0 )
SET @tempString = replace(@tempString,'desc','ASC')
else
SET @tempString = replace(@tempString,'asc','DESC')
SET @resultString = @resultString + @tempString+ ',' ;
SET @sourceString = SUBSTRING(@sourceString, @index+1, @len-@index)
SET @index = CHARINDEX(',', @sourceString)
END
SET @len2 = len(@resultString)
SET @resultString = substring(@resultString,1,@len2-1)
RETURN @resultString
END
此SQL函数的功能如下:(用来反转任意多个排序字段的排序方式)
declare @strSource nvarchar(255)
set @strSource = dbo.fn_chongchong_ReversOrder('test_OrderID ASC,test_OtherID DESC,test_Date DESC')
print @strSource
返回输出 test_OrderID DESC,test_OtherID ASC,test_Date ASC
利用第二种方法写出如下的代码:
SET @orderKey = @orderKey + CASE @orderType WHEN 0 THEN ' ASC' ELSE ' DESC' END;
SET @orderKeyRevers = dbo.fn_chongchong_ReversOrder(@orderKey); -- 反转
SET @orderFields = replace(replace(@orderKey,'ASC',''),'DESC',''); --去掉排序标记符
SET @strSQL = 'SELECT ' + @fieldNameList + ' FROM ' + @tableName
+ @where1 + @primaryKey + 'in('
+'SELECT TOP '+ CAST(@pageSize as varchar) + @primaryKey + ' FROM ('
+'SELECT TOP '+ CAST(@pageSize*(@pageIndex) as varchar) + @orderFields +' FROM '+ @tableName
+ @where2 + ' ORDER BY ' + @orderKey
+ ') t ORDER BY '+ @orderKeyRevers
+ ') order by ' + @orderKey;
注意这种方法,当翻页到最后一页的时候有个Bug,下面这段用来修正这个Bug.
IF(@pageIndex >= @totalPage) -- 修正第后一页
SET @strSQL = 'SELECT ' + @fieldNameList + ' FROM ' + @tableName + @where1 + @primaryKey + 'in('
+ 'SELECT TOP ' + CAST(@lastRecords as varchar) + @primaryKey + ' FROM '+ @tableName + ' ORDER BY ' + @orderKey + + CASE @orderType WHEN 0 THEN ' DESC' ELSE ' ASC' END
+') order by ' + @orderKey + CASE @orderType WHEN 0 THEN ' ASC' ELSE ' DESC' END;
OK,就是这样...