博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
曾经用过的Sql Server分页方法小结
阅读量:6537 次
发布时间:2019-06-24

本文共 2760 字,大约阅读时间需要 9 分钟。

工作这些年, 数据库分页也用过几种方案, 总结如下:

1.用row_number函数及临时表分页, 适用sql 2005/2008.

大致思路如下:

SELECT *, ROW_NUMBER() OVER (ORDER BY  OrderID DESC  ) AS rownumber

into #SO
FROM tbl_SalesOrder
Where condition...

SELECT *
FROM #SO
Where (#SO.rownumber between 1 AND 15
order by #SO.RowNumber
 

2.用row_number函数及表表达式分页, 适用sql 2005/2008, 这个就不用临时表了.

要拼sql, 大致思路如下:

declare @SQLString varchar(2000)

set @SQLString='SELECT *, ROW_NUMBER() OVER (ORDER BY  OrderID DESC  ) AS rownumber

                          into #SO
                          FROM tbl_SalesOrder
                          Where condition...'

 set @SQLString = 'with tempTable as ('+ @SQLString +')'

 set @SQLString = @SQLString + ' Select * from tempTable where (rownumber between @FirstRec1 and @LastRec1) order by rownumber; '

 EXECUTE sp_executesql @SQLString

 

3.在没有row_number的早期版本时, 用临时表存储符合条件的全部记录并设置自增字段, 然后按照传入的页码返回相应的数据, 适用Sql 2000/2005/2008.

缺点是效率不高, 但很通用.

这倒是有个完整版:

ALTER PROCEDURE [dbo].[lzd_sp_getDocumentListBySQL]

@iPage int,
@iPageSize int,
@searchstring nvarchar(4000),
@orderstring nvarchar(4000),
@PageCount int output,
@RecordCount int output
AS
BEGIN
-- declare variables
DECLARE @iPageCount int -- total number of pages
DECLARE @iStart numeric -- start record
DECLARE @iEnd numeric -- end record

-- disable row counts

SET NOCOUNT ON

--建立临时表。

CREATE TABLE #Document       (
--这个自增字段十分关键,就是靠他来完成分页标示。
ID numeric(18, 0) IDENTITY,    
Num_InfoID numeric(18, 0) NOT NULL ,
Num_AdminID numeric(18, 0) NULL ,
VC_TITLE varchar (100)  NULL ,
Num_Type numeric(18,0) null,
Dt_Pub datetime NULL,
Vc_File varchar(100) null,
Num_DeptID numeric(18,0) null,
Vc_Content text null
)

--先转存到下面的这个纪录集。

exec(
'INSERT INTO #Document(Num_InfoID,Num_AdminID,VC_TITLE,Num_Type,Dt_Pub,Vc_File,Num_DeptID,Vc_Content)
SELECT Num_InfoID,Num_AdminID,VC_TITLE,Num_Type,Dt_Pub,Vc_File,Num_DeptID,Vc_Content
FROM dbo.Tbl_Document ' + @searchstring + ' order by ' + @orderstring
)     
--计算记录总数
SELECT @iPageCount = COUNT(*)
FROM  #Document

SELECT @RecordCount = @iPageCount

SELECT @iPageCount = CEILING(@iPageCount / @iPageSize) + 1

-- 检查页号是否合法

IF @iPage < 1
SELECT @iPage = 1

IF @iPage > @iPageCount

SELECT @iPage = @iPageCount

-- 计算开始和结束记录位置

SELECT @iStart = (@iPage - 1) * @iPageSize
SELECT @iEnd = @iStart + @iPageSize + 1

--这条sql语句就是选取固定的纪录集。

SELECT Num_InfoID,Num_AdminID,VC_TITLE,Num_Type,Dt_Pub,Vc_File,Num_DeptID,Vc_Content
FROM #Document
WHERE ID > @iStart
AND ID < @iEnd

DROP TABLE #Document

SELECT @PageCount

-- turn back on record counts
SET NOCOUNT OFF
-- Return the number of records left
RETURN @PageCount
END

 

4.使用Top分页

这个思路网上看来的, 没实际用过, 也是一种思路, 看起来也是要拼sql的.

大致思路如下: 将符合条件的数据的前几页数据id提取出来, 然后top PageRowCount 并且not in这些id.

SELECT TOP @PageRowCount *

FROM tbl_user
WHERE
(
Num_LoginID NOT IN (SELECT TOP (@PageRowCount*(@CurrentPage-1)) Num_LoginID FROM Tbl_User ORDER BY Num_LoginID DESC)
)
ORDER BY Num_LoginID DESC

 

推荐资料:

 

转载地址:http://icbdo.baihongyu.com/

你可能感兴趣的文章
Java中的finalize()
查看>>
程序员常用借口指南
查看>>
关于PXE网络安装linux系统中碰到的个别问题
查看>>
storm笔记一
查看>>
awk 常用方法
查看>>
Android网络框架实现之【Retrofit+RxJava】
查看>>
Android文件的加密与解密
查看>>
Log4j 2使用教程
查看>>
SOAP webserivce 和 RESTful webservice 对比及区别
查看>>
安装apache
查看>>
JavaScript中DOM基础
查看>>
完全配置Python3+PyQt5+Eric6开发环境
查看>>
做产品的一些思考
查看>>
Cookie编程问题及Base64中文编码问题
查看>>
外媒报道电子垃圾被运入中国
查看>>
异常检测-Anomaly detection
查看>>
【原】记录一句话
查看>>
Android标题栏,状态栏
查看>>
445. Add Two Numbers II(链表求和)
查看>>
Unity 多屏(分屏)显示,Muti_Display
查看>>