经过优化测试的SQL分页存储过程
SQLserver分页的4种方法示例(很全面)

SQLserver分页的4种⽅法⽰例(很全⾯)这篇博客讲的是SQL server的分页⽅法,⽤的SQL server 2012版本。
下⾯都⽤pageIndex表⽰页数,pageSize表⽰⼀页包含的记录。
并且下⾯涉及到具体例⼦的,设定查询第2页,每页含10条记录。
⾸先说⼀下SQL server的分页与MySQL的分页的不同,mysql的分页直接是⽤limit (pageIndex-1),pageSize就可以完成,但是SQL server 并没有limit关键字,只有类似limit的top关键字。
所以分页起来⽐较⿇烦。
SQL server分页我所知道的就只有四种:三重循环;利⽤max(主键);利⽤row_number关键字,offset/fetch next关键字(是通过搜集⽹上的其他⼈的⽅法总结的,应该⽬前只有这四种⽅法的思路,其他⽅法都是基于此变形的)。
要查询的学⽣表的部分记录⽅法⼀:三重循环思路先取前20页,然后倒序,取倒序后前10条记录,这样就能得到分页所需要的数据,不过顺序反了,之后可以将再倒序回来,也可以不再排序了,直接交给前端排序。
还有⼀种⽅法也算是属于这种类型的,这⾥就不放代码出来了,只讲⼀下思路,就是先查询出前10条记录,然后⽤not in排除了这10条,再查询。
代码实现-- 设置执⾏时间开始,⽤来查看性能的set statistics time on ;-- 分页查询(通⽤型)select *from (select top pageSize *from (select top (pageIndex*pageSize) *from studentorder by sNo asc ) -- 其中⾥⾯这层,必须指定按照升序排序,省略的话,查询出的结果是错误的。
as temp_sum_studentorder by sNo desc ) temp_orderorder by sNo asc-- 分页查询第2页,每页有10条记录select *from (select top 10 *from (select top 20 *from studentorder by sNo asc ) -- 其中⾥⾯这层,必须指定按照升序排序,省略的话,查询出的结果是错误的。
sqlserver存储过程调试方法

sqlserver存储过程调试方法SQL Server是一种常用的关系型数据库管理系统,它提供了存储过程的功能,可以在数据库中存储一段预编译的SQL代码,并在需要时进行调用。
存储过程通常用于执行复杂的数据库操作,提高数据库的性能和安全性。
在开发和调试存储过程时,我们需要一些方法来验证和调试代码的正确性。
本文将介绍一些常用的SQL Server 存储过程调试方法。
1. 使用PRINT语句输出调试信息在存储过程中,可以使用PRINT语句输出一些调试信息,例如变量的值、执行的步骤等。
通过在关键位置添加PRINT语句,可以观察存储过程执行过程中的中间结果,从而验证代码的正确性。
例如:```PRINT '开始执行存储过程'PRINT '变量@x的值为:' + CONVERT(VARCHAR(10), @x)```2. 使用SELECT语句输出结果集在存储过程中,可以使用SELECT语句返回结果集。
通过在存储过程中添加SELECT语句,可以观察查询结果并验证代码的正确性。
例如:```SELECT * FROM 表名 WHERE 条件```3. 使用TRY...CATCH块捕获异常在存储过程中,可以使用TRY...CATCH块来捕获异常并处理错误。
通过在TRY块中执行代码,在CATCH块中处理异常信息,可以更好地调试存储过程并处理潜在的错误。
例如:```BEGIN TRY-- 执行代码END TRYBEGIN CATCH-- 处理异常END CATCH```4. 使用SET NOEXEC语句暂停执行在存储过程中,可以使用SET NOEXEC语句来暂停执行。
通过在存储过程中添加SET NOEXEC语句,并将其设置为ON或OFF,可以控制存储过程的执行。
例如:```SET NOEXEC ON -- 暂停执行SET NOEXEC OFF -- 恢复执行```5. 使用SET SHOWPLAN_ALL语句显示执行计划在存储过程中,可以使用SET SHOWPLAN_ALL语句来显示执行计划。
Sql中Output参数用法和分页存储过程

Sql中Output参数⽤法和分页存储过程USE [CapitalFortune]GO/****** Object: StoredProcedure [dbo].[SetMultiPages] Script Date: 05/30/2012 10:17:02 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author: hugejile-- alter date: 2070-9-29-- Description: 分页,请勿随意改动-- =============================================ALTER PROCEDURE [dbo].[SetMultiPages]-- Add the parameters for the stored procedure here@TableName NVARCHAR(2000),@ColumnNames NVARCHAR(2000),@Conditions NVARCHAR(2000),@OrderbyString NVARCHAR(2000),@PageSize INT=1000,@CurrentPage INT=1,@RecordCount INT=0 OUTPUT,@PageCount INT=1 OUTPUTASBEGIN-- SET NOCOUNT ON added to prevent extra result sets FROM-- interfering with SELECT statements.SET NOCOUNT ON;DECLARE @Sql NVARCHAR(4000),@RowCount INTSET @RowCount=0IF @ColumnNames is null or LEN(@ColumnNames)=0BEGINSET @ColumnNames='*'ENDIF @CurrentPage is nullBEGINSET @CurrentPage=1ENDIF @PageSize is nullBEGINSET @PageSize=10ENDIF @Conditions is nullBEGINSET @Conditions=''ENDELSEBEGINIF LEN(@Conditions)<>0BEGINSET @Conditions=' WHERE ' + @ConditionsENDEND-- INSERT statements for procedure hereIF @CurrentPage>0BEGINSET @Sql= N'SELECT * FROM (SELECT , (ROW_NUMBER() over (ORDER BY )) AS RowNum FROM )T WHERE T.RowNum Between '+Cast((@CurrentPage-1)*@PageSize+1 AS NVARCHAR(10)) + ' and ' + Cast(@CurrentPage*@PageSize AS NVARCHAR(10)) + ';SET @RowCount =ROWCOUNT_BIG()'PRINT 'SELECT CommandText: ' + @SqlEXECUTE sp_executesql @Sql,N'@RowCount INT OUTPUT',@RowCount OUTPUTSET @Sql = 'SELECT @RecordCount = COUNT(*) FROMPRINT 'Count CommandText: ' + @SqlEXECUTE sp_executesql @Sql,N'@RecordCount INT OUTPUT',@RecordCount OUTPUTSET @PageCount=ceiling(1.0 * @RecordCount / @PageSize)PRINT @RecordCount--RETURN @RecordCountENDELSE IF @PageSize>0BEGINSET @Sql= N'SELECT TOP ' + Cast(@PageSize as nvarchar(10)) + ' ' + @ColumnNames + ', (ROW_NUMBER() over (ORDER BY )) AS RowNum FROM ORDER BY ' + @OrderbyStringPRINT 'SELECT CommandText: ' + @SqlEXEC (@Sql)SET @Sql = 'SELECT @RecordCount = COUNT(*) FROMPRINT 'Count CommandText: ' + @SqlEXECUTE sp_executesql @Sql,N'@RecordCount INT OUTPUT',@RecordCount OUTPUTSET @PageCount = CEILING(CAST(@RecordCount AS FLOAT)/CAST(@PageSize AS FLOAT))--print cast(@RecordCount as nvarchar(10)) + ' pagesize ' + Cast(@PageSize as nvarchar(10))--print @PageCount--RETURN @RowCountENDELSEBEGINSET @Sql= N'SELECT ' + @ColumnNames + ', (ROW_NUMBER() over (ORDER BY )) AS RowNum FROM ORDER BY ' +@OrderbyString +'; SET @RecordCount = ROWCOUNT_BIG()'PRINT 'SELECT CommandText: ' + @Sql--EXEC (@Sql)--SET @Sql = ''--PRINT 'Count CommandText: ' + @SqlEXECUTE sp_executesql @Sql,N'@RecordCount INT OUTPUT',@RecordCount OUTPUTSET @PageCount = -1ENDRETURN 1END这个是分页存储过程,百万级数据应该没有问题调⽤⽅法DECLARE @return_value INT,@RecordCount INT ,@PageCount INT ,@PageSize INTEXEC @return_value = [dbo].[SetMultiPages]@TableName = 'USERS',@ColumnNames = '*',@Conditions = '',@OrderbyString = 'UserId',@PageSize = 10,@CurrentPage = 0,@RecordCount = @RecordCount output,@PageCount = @PageCount outputSELECT @RecordCount AS N'RecordCount',@PageCount AS N'PageCount',@PageSize AS N'PageSize'@RecordCount = @RecordCount output,@PageCount = @PageCount output这两个参数是输出参数,⽤来接受存储过程中的输出参数的值,计算总数据和总页数。
sqlserver 2008 分页方法

sqlserver 2008 分页方法### SQL Server 2008 分页方法在数据库应用开发中,分页技术是一种常用的手段,它可以帮助我们提高数据检索的效率,减少内存消耗,并且提升用户体验。
SQL Server 2008 提供了多种分页方法,下面将详细介绍几种在SQL Server 2008 中实现分页的技术。
#### 1.使用`ROW_NUMBER()``ROW_NUMBER()` 是SQL Server 2008 中最常用的分页方法之一。
它会为结果集中的每一行分配一个唯一的连续整数。
```sql-- 假设要查询的表名为YourTable,排序字段为SomeColumnSELECT *FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY SomeColumn) AS RowNumFROM YourTable) AS PagedTableWHERE RowNum BETWEEN @StartRow AND @EndRow;```在这里,`@StartRow` 和`@EndRow` 是变量,代表你要查询的页码范围。
#### 2.使用`TOP` 和`OFFSET`虽然`TOP` 子句在SQL Server 2005 中已经存在,但`OFFSET` 关键字是在SQL Server 2012 中引入的。
不过,通过某种方式,我们可以在SQL Server 2008 中模拟这种语法。
```sql-- 假设要查询的页码为PageNumber,每页显示的记录数为PageSize SELECT *FROM YourTableORDER BY SomeColumnOFFSET ((@PageNumber - 1) * @PageSize) ROWSFETCH NEXT @PageSize ROWS ONLY;```请注意,这里的`OFFSET` 和`FETCH NEXT` 语法在SQL Server 2008 中不能直接使用,这里只是展示可能的替代方式。
oracle 分页sql写法

一、概述在进行数据库查询时,经常会遇到需要分页展示数据的情况。
而在Oracle数据库中,需要用到分页查询的SQL语句。
本文将就Oracle 中的分页SQL写法进行详细介绍。
二、基本分页SQL语句在Oracle数据库中,可以使用ROWNUM来实现分页查询。
以下是基本的分页SQL语句示例:```sqlSELECT * FROM (SELECT t.*, ROWNUM rnFROM (SELECT * FROM your_table ORDER BY order_column) t WHERE ROWNUM <= pageSize * pageNum)WHERE rn > pageSize * (pageNum - 1)```其中,your_table是要查询的表名,order_column是用来排序的字段,pageSize是每页展示的数据条数,pageNum是要查询的页数。
三、分页SQL写法解析1. 内部查询和外部查询分页SQL语句中,有一个内部查询和一个外部查询。
内部查询用来获取排序后的数据和每行数据对应的行号,外部查询用来根据行号来筛选需要的数据并展示。
2. 内部查询内部查询中使用了ROWNUM来标记行号,并通过ORDER BY语句来对数据进行排序。
内部查询的结果会被外部查询筛选。
3. 外部查询外部查询使用了WHERE语句来筛选出需要展示的数据,并且通过pageSize和pageNum来计算需要查询的数据范围。
四、使用样例假设有一个名为employee的表,包含字段id、name、age,现需要从该表中查询第2页的数据,每页展示10条数据,并按id字段进行排序。
则对应的分页SQL语句为:```sqlSELECT * FROM (SELECT t.*, ROWNUM rnFROM (SELECT id, name, age FROM employee ORDER BY id) t WHERE ROWNUM <= 10 * 2)WHERE rn > 10 * (2 - 1)```这条SQL语句将返回employee表中第11-20条数据,并按id字段排序。
SQLServer存储过程语法及实例

SQLServer存储过程语法及实例Transact-SQL中的存储过程,⾮常类似于Java语⾔中的⽅法,它可以重复调⽤。
当存储过程执⾏⼀次后,可以将语句缓存中,这样下次执⾏的时候直接使⽤缓存中的语句。
这样就可以提⾼存储过程的性能。
Ø 存储过程的概念存储过程Procedure是⼀组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,⽤户通过指定存储过程的名称并给出参数来执⾏。
存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。
由于存储过程在创建时即在数据库服务器上进⾏了编译并存储在数据库中,所以存储过程运⾏要⽐单个的SQL语句块要快。
同时由于在调⽤时只需⽤提供存储过程名和必要的参数信息,所以在⼀定程度上也可以减少⽹络流量、简单⽹络负担。
1、存储过程的优点A、存储过程允许标准组件式编程存储过程创建后可以在程序中被多次调⽤执⾏,⽽不必重新编写该存储过程的SQL语句。
⽽且数据库专业⼈员可以随时对存储过程进⾏修改,但对应⽤程序源代码却毫⽆影响,从⽽极⼤的提⾼了程序的可移植性。
B、存储过程能够实现较快的执⾏速度如果某⼀操作包含⼤量的T-SQL语句代码,分别被多次执⾏,那么存储过程要⽐批处理的执⾏速度快得多。
因为存储过程是预编译的,在⾸次运⾏⼀个存储过程时,查询优化器对其进⾏分析、优化,并给出最终被存在系统表中的存储计划。
⽽批处理的T-SQL语句每次运⾏都需要预编译和优化,所以速度就要慢⼀些。
C、存储过程减轻⽹络流量对于同⼀个针对数据库对象的操作,如果这⼀操作所涉及到的T-SQL语句被组织成⼀存储过程,那么当在客户机上调⽤该存储过程时,⽹络中传递的只是该调⽤语句,否则将会是多条SQL语句。
从⽽减轻了⽹络流量,降低了⽹络负载。
D、存储过程可被作为⼀种安全机制来充分利⽤系统管理员可以对执⾏的某⼀个存储过程进⾏权限限制,从⽽能够实现对某些数据访问的限制,避免⾮授权⽤户对数据的访问,保证数据的安全。
MySQL动态SQL的拼接以及执行、分页

MySQL 动态SQL 的拼接以及执⾏、分页1:建⽴存储过程,标记参数2:先打印出sql字符串,判断是否是理想值3:⼲掉注释,执⾏sql 语句,看结果CREATE DEFINER =`root`@`localhost` PROCEDURE `pos_get_drugInList`(IN page integer ,IN limitz integer ,IN drugCodez VARCHAR (50),IN effectDatez VARCHAR (50),IN chainIdz VARCHAR (19))BEGINDECLARE start integer ;set start = (page -1)*limitz;set @sql = 'select * from dsos_vot_drugrecord where 1 = 1';#获取药品信息(最多⼀千条)if drugCodez <> '' thenset @sql = CONCAT(@sql ,' and drugCode= ',drugCodez);end if ;if effectDatez <> '' thenset @sql = CONCAT(@sql,' and effectDate= ','''',effectDatez,'''');end if ;if chainIdz <> '' thenset @sql = CONCAT(@sql ,' and chainId= ',chainIdz);end if ;set @sql = CONCAT(@sql ,' limit ',start,', ',limitz);-- PREPARE distSQL FROM @SQL ;-- EXECUTE distSQL;-- DEALLOCATE PREPARE distSQL ;select @sql ;ENDCREATE DEFINER =`root`@`localhost` PROCEDURE `pos_get_drugInList`(IN page integer ,IN limitz integer ,IN drugCodez VARCHAR (50),IN effectDatez VARCHAR (50),IN chainIdz VARCHAR (19))BEGINDECLARE start integer ;set start = (page -1)*limitz;set @sql = 'select * from dsos_vot_drugrecord where 1 = 1';#获取药品信息(最多⼀千条)if drugCodez <> '' thenset @sql = CONCAT(@sql ,' and drugCode= ',drugCodez);end if ;if effectDatez <> '' thenset @sql = CONCAT(@sql,' and effectDate= ','''',effectDatez,'''');end if ;if chainIdz <> '' then4:结果set @sql = CONCAT(@sql ,' and chainId= ',chainIdz); end if ;set @sql = CONCAT(@sql ,' limit ',start,', ',limitz);PREPARE distSQL FROM @SQL ;EXECUTE distSQL;DEALLOCATE PREPARE distSQL ;#select @sql ;END。
MySql实现分页查询的SQL,mysql实现分页查询的sql语句(转)

MySql实现分页查询的SQL,mysql实现分页查询的sql语句
(转)
/sxdtzhaoxinguo/article/details/51481430
摘要:实现分页查询的SQL语句写法!
⼀:分页需求:
客户端通过传递start(页码),limit(每页显⽰的条数)两个参数去分页查询数据库表中的数据,那我们知道MySql数据库提供了分页的函数limit m,n,但是该函数的⽤法和我们的需求不⼀样,所以就需要我们根据实际情况去改写适合我们⾃⼰的分页语句,具体的分析如下:
⽐如:
查询第1条到第10条的数据的sql是:select * from table limit 0,10; ->对应我们的需求就是查询第⼀页的数据:select * from table limit (1-1)*10,10;
查询第10条到第20条的数据的sql是:select * from table limit 10,20; ->对应我们的需求就是查询第⼆页的数据:select * from table limit (2-1)*10,10;
查询第20条到第30条的数据的sql是:select * from table limit 20,30; ->对应我们的需求就是查询第三页的数据:select * from table limit (3-1)*10,10;
⼆:通过上⾯的分析,可以得出符合我们⾃⼰需求的分页sql格式是:select * from table limit (start-1)*limit,limit; 其中start是页码,limit是每页显⽰的条数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
经过优化测试的SQL分页存储过程2009-10-24 23:20建立一个 Web 应用,分页浏览功能必不可少。
这个问题是数据库处理中十分常见的问题。
经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用游标)来实现分页。
但这种分页方法仅适用于较小数据量的情形,因为游标本身有缺点:游标是存放在内存中,很费内存。
游标一建立,就将相关的记录锁住,直到取消游标。
游标提供了对特定集合中逐行扫描的手段,一般使用游标来逐行遍历数据,根据取出数据条件的不同进行不同的操作。
而对于多表和大表中定义的游标(大的数据集合)循环很容易使程序进入一个漫长的等待甚至死机。
更重要的是,对于非常大的数据模型而言,分页检索时,如果按照传统的每次都加载整个数据源的方法是非常浪费资源的。
现在流行的分页方法一般是检索页面大小的块区的数据,而非检索所有的数据,然后单步执行当前行。
最早较好地实现这种根据页面大小和页码来提取数据的方法大概就是“俄罗斯存储过程”。
这个存储过程用了游标,由于游标的局限性,所以这个方法并没有得到大家的普遍认可。
后来,网上有人改造了此存储过程,下面的存储过程就是结合我们的办公自动化实例写的分页存储过程:CREATE procedure pagination1(@pagesize int, --页面大小,如每页存储20条记录@pageindex int --当前页码)asset nocount onbegindeclare @indextable table(id int identity(1,1),nid int) --定义表变量declare @PageLowerBound int --定义此页的底码declare @PageUpperBound int --定义此页的顶码set @PageLowerBound=(@pageindex-1)*@pagesizeset @PageUpperBound=@PageLowerBound+@pagesizeset rowcount @PageUpperBoundinsert into @indextable(nid) select gid from TGongwenwhere fariqi >dateadd(day,-365,getdate()) order by fariqi descselect O.gid,O.mid,O.title,O.fadanwei,O.fariqi from TGongwenO,@indextable twhere O.gid=t.nid and t.id>@PageLowerBoundand t.id<=@PageUpperBound order by t.id endset nocount off以上存储过程运用了SQL SERVER的最新技术――表变量。
应该说这个存储过程也是一个非常优秀的分页存储过程。
当然,在这个过程中,您也可以把其中的表变量写成临时表:CREATE TABLE #Temp。
但很明显,在SQL SERVER中,用临时表是没有用表变量快的。
所以笔者刚开始使用这个存储过程时,感觉非常的不错,速度也比原来的ADO的好。
但后来,我又发现了比此方法更好的方法。
笔者曾在网上看到了一篇小短文《从数据表中取出第n条到第m条的记录的方法》,全文如下:从publish 表中取出第 n 条到第 m 条的记录:SELECT TOP m-n+1 *FROM publishWHERE (id NOT IN(SELECT TOP n-1 idFROM publish))id 为publish 表的关键字我当时看到这篇文章的时候,真的是精神为之一振,觉得思路非常得好。
等到后来,我在作办公自动化系统(+ C#+SQL SERVER)的时候,忽然想起了这篇文章,我想如果把这个语句改造一下,这就可能是一个非常好的分页存储过程。
于是我就满网上找这篇文章,没想到,文章还没找到,却找到了一篇根据此语句写的一个分页存储过程,这个存储过程也是目前较为流行的一种分页存储过程,我很后悔没有争先把这段文字改造成存储过程:CREATE PROCEDURE pagination2(@SQL nVARCHAR(4000), --不带排序语句的SQL语句@Page int, --页码@RecsPerPage int, --每页容纳的记录数@ID VARCHAR(255), --需要排序的不重复的ID号@Sort VARCHAR(255) --排序字段及规则)ASDECLARE @Str nVARCHAR(4000)SET @Str=''SELECT TOP ''+CAST(@RecsPerPage AS VARCHAR(20))+'' * FROM (''+@SQL+'') T WHERE T.''+@ID+''NOT IN (SELECT TOP''+CAST((@RecsPerPage*(@Page-1))AS VARCHAR(20))+'' ''+@ID+'' FROM (''+@SQL+'') T9 ORDER BY ''+@Sort+'') ORDER BY ''+@SortPRINT @StrEXEC sp_ExecuteSql @StrGO其实,以上语句可以简化为:SELECT TOP 页大小 *FROM Table1 WHERE (ID NOT IN (SELECT TOP 页大小*页数 id FROM 表 ORDER BY id))ORDER BY ID但这个存储过程有一个致命的缺点,就是它含有NOT IN字样。
虽然我可以把它改造为:SELECT TOP 页大小 *FROM Table1 WHERE not exists(select * from (select top (页大小*页数) * from table1 order by id) b where b.id=a.id )order by id即,用not exists来代替not in,但我们前面已经谈过了,二者的执行效率实际上是没有区别的。
既便如此,用TOP 结合NOT IN的这个方法还是比用游标要来得快一些。
虽然用not exists并不能挽救上个存储过程的效率,但使用SQL SERVER中的TOP关键字却是一个非常明智的选择。
因为分页优化的最终目的就是避免产生过大的记录集,而我们在前面也已经提到了TOP的优势,通过TOP 即可实现对数据量的控制。
在分页算法中,影响我们查询速度的关键因素有两点:TOP和NOT IN。
TOP 可以提高我们的查询速度,而NOT IN会减慢我们的查询速度,所以要提高我们整个分页算法的速度,就要彻底改造NOT IN,同其他方法来替代它。
我们知道,几乎任何字段,我们都可以通过max(字段)或min(字段)来提取某个字段中的最大或最小值,所以如果这个字段不重复,那么就可以利用这些不重复的字段的max或min作为分水岭,使其成为分页算法中分开每页的参照物。
在这里,我们可以用操作符“>”或“<”号来完成这个使命,使查询语句符合SARG形式。
如:Select top 10 * from table1 where id>200于是就有了如下分页方案:select top 页大小 *from table1where id>(select max (id) from(select top ((页码-1)*页大小) id from table1 order by id) as Torder by id在选择即不重复值,又容易分辨大小的列时,我们通常会选择主键。
下表列出了笔者用有着1000万数据的办公自动化系统中的表,在以GID(GID是主键,但并不是聚集索引。
)为排序列、提取gid,fariqi,title字段,分别以第1、10、100、500、1000、1万、10万、25万、50万页为例,测试以上三种分页方案的执行速度:(单位:毫秒)从上表中,我们可以看出,三种存储过程在执行100页以下的分页命令时,都是可以信任的,速度都很好。
但第一种方案在执行分页1000页以上后,速度就降了下来。
第二种方案大约是在执行分页1万页以上后速度开始降了下来。
而第三种方案却始终没有大的降势,后劲仍然很足。
在确定了第三种分页方案后,我们可以据此写一个存储过程。
大家知道SQL SERVER的存储过程是事先编译好的SQL语句,它的执行效率要比通过WEB页面传来的SQL语句的执行效率要高。
下面的存储过程不仅含有分页方案,还会根据页面传来的参数来确定是否进行数据总数统计。
--获取指定页的数据:CREATE PROCEDURE pagination3@tblName varchar(255), -- 表名@strGetFields varchar(1000) = ''*'', -- 需要返回的列@fldName varchar(255)='''', -- 排序的字段名@PageSize int = 10, -- 页尺寸@PageIndex int = 1, -- 页码@doCount bit = 0, -- 返回记录总数, 非 0 值则返回@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序@strWhere varchar(1500) = '''' -- 查询条件 (注意: 不要加 where)ASdeclare @strSQL varchar(5000) -- 主语句declare @strTmp varchar(110) -- 临时变量declare @strOrder varchar(400) -- 排序类型if @doCount != 0beginif @strWhere !=''''set @strSQL = "select count(*) as Total from [" + @tblName + "] where "+@strWhereelseset @strSQL = "select count(*) as Total from [" + @tblName + "]"end--以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。