这是我之前整理的高性能SQLServer 通用分页存储过程,测试性能还不错,特此分享出来,如果有人能更好地优化,请留言,谢谢!

SQL代码

 1 USE [数据库名称]
 2 GO
 3 /****** Object:  StoredProcedure [dbo].[dbTab_PagerHelper]    Script Date: 08/22/2010 13:30:39 ******/
 4 SET ANSI_NULLS ON
 5 GO
 6 SET QUOTED_IDENTIFIER ON
 7 GO
 8 -- =============================================
 9 -- Author:    Jarry
10 -- Create date: 2009-08-01
11 -- Description:    通用分页存储过程
12 -- =============================================
13 CREATE PROCEDURE [dbo].[dbTab_PagerHelper] 
14     @TableName VARCHAR(50), --表名
15     @FieldNames VARCHAR(1000), --显示列名,如果是全部字段则为*
16     @WhereString VARCHAR(256) = NULL, --查询条件 不含'WHERE'字符,如[id]>5 AND [userid]>10000
17     @OrderField VARCHAR(256) = NULL, --排序不含'ORDER BY'字符,当@SortType=3时生效,必须指定ASC或DESC,建议在最后加上主键
18     @OrderType TINYINT, --排序规则(1:单列正序ASC;2:单列倒序DESC;3:多列排序;)
19     @PageIndex INT, --当前页数
20     @PageSize INT, --每页输出的记录数
21     @RecorderCount INT = 0 --记录总数,如果小于等于0则重新统计总数
22 AS
23 BEGIN
24     SET NOCOUNT ON;
25     DECLARE @LowerBound int, @UpperBound int;
26     SET @LowerBound = (@PageSize * (@PageIndex - 1));
27     SET @UpperBound = (@LowerBound + @PageSize - 1);
28     DECLARE @MSSQL NVARCHAR(3000), @Where NVARCHAR(500), @Order VARCHAR(256), @Order2 VARCHAR(256);
29     SET @MSSQL = '';
30     SET @Where = '';
31     SET @Order = '';
32     SET @Order2 = '';
33     IF((@WhereString IS NOT NULL) AND (@WhereString != '')) 
34         SET @Where = ' WHERE ' + @WhereString;
35     IF((@OrderType IS NOT NULL) AND (@OrderType > 0))
36     BEGIN
37         SET @Order = ' ORDER BY ' + @OrderField;
38         IF(@OrderType = 1)
39             SET @Order = @Order + ' ASC';
40         ELSE IF(@OrderType = 2)
41             SET @Order = @Order + ' DESC';
42         SET @Order2 = REPLACE(REPLACE(UPPER(@Order), ' ASC', ' {ASC}'), ' DESC', ' {DESC}');
43         SET @Order2 = REPLACE(REPLACE(UPPER(@Order2), ' {ASC}', ' DESC'), ' {DESC}', ' ASC');
44     END
45     
46     --重新统计总记录数
47     IF(@RecorderCount <= 0)
48         EXECUTE('SELECT COUNT(*) AS [RecorderCount] FROM ' + @TableName + @Where);
49     ELSE
50         SELECT @RecorderCount AS [RecorderCount];
51     
52     IF(@PageIndex <= 1) --如果是第一页
53     BEGIN
54         SET @MSSQL = 'SELECT TOP ' + STR(@PageSize) +' '+ @FieldNames + ' FROM ' + @TableName + @Where + @Order;
55     END
56     ELSE IF((@PageSize*@PageIndex) >= @RecorderCount) --如果是最后一页
57     BEGIN
58         SET @MSSQL = 'SELECT ' + @FieldNames + ' FROM (SELECT TOP ' + STR(@PageSize - ((@PageSize*@PageIndex) - @RecorderCount)) + ' ' + @FieldNames + ' FROM ' + @TableName + @Where + @Order2 + ') AS [PagerTempTable]' + @Order;
59     END
60     ELSE
61     BEGIN
62         IF(@OrderType < 3) --单列排序分页方法
63         BEGIN
64             SET @MSSQL = 'SELECT TOP ' + STR(@PageSize);
65             SET @MSSQL = @MSSQL + ' ' + @FieldNames;
66             SET @MSSQL = @MSSQL + ' FROM ' + @TableName;
67             SET @MSSQL = @MSSQL + @Where;
68             DECLARE @TempStrings NVARCHAR(500);
69             SET @TempStrings = '';
70             IF(@OrderType > 0)
71             BEGIN
72                 IF(@Where <> '')
73                     SET @TempStrings = @TempStrings + ' AND';
74                 ELSE
75                     SET @TempStrings = ' WHERE ';
76                 SET @TempStrings = @TempStrings + ' ' + @OrderField;
77                 
78                 IF(@OrderType = 1)
79                 BEGIN
80                     SET @TempStrings = @TempStrings + ' > (SELECT MAX';
81                 END
82                 ELSE
83                 BEGIN
84                     SET @TempStrings = @TempStrings + ' < (SELECT MIN';
85                 END
86                 SET @TempStrings = @TempStrings + '(' + @OrderField + ') FROM (SELECT TOP '+STR(@LowerBound)+' ' + @OrderField + ' FROM ' + @TableName + @Where + @Order;
87                 SET @TempStrings = @TempStrings + ') AS [PagerTempTable])';
88                 
89             END
90             SET @MSSQL = @MSSQL + @TempStrings + @Order;
91         END
92         ELSE --多列排序分页方法
93         BEGIN
94             SET @MSSQL = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldNames + ' FROM (SELECT TOP ' + STR(@PageSize) + ' ' + @FieldNames + ' FROM (SELECT TOP ' + STR(@PageSize*@PageIndex) + ' ' + @FieldNames + ' FROM ' + @TableName + @Where + @Order + ') AS [PagerTempTable]' + @Order2 + ') AS [PagerTempTable]' + @Order + ';'
95         END
96     END
97     EXECUTE(@MSSQL);
98 END

转载于:https://www.cnblogs.com/hijarry/archive/2010/08/22/1805809.html

高性能SQLServer通用分页存储过程相关推荐

  1. SQL SERVER 通用分页存储过程

    SQL SERVER 通用分页存储过程 从SQLSERVER 2005开始,提供了Row_Number()函数,利用函数生成的Index来处理分页,按照正常的逻辑思维都是传pageIndex和page ...

  2. 通用分页存储过程(转自邹建)

    --TOP n 实现的通用分页存储过程(转自邹建) CREATE PROC sp_PageView @tbname     sysname,               --要分页显示的表名 @Fie ...

  3. Sql Server通用分页存储过程

    sql server2000分页方式很多,效率吗  当到达10万级以上就有些吃力了,这里暂时不例出来了 sql server2005以上就有了row_number 也是一大进步,详情如下参考 Sql ...

  4. 从通用分页存储过程[ROWCOUNT方式]抽出适合自己需求的分页过程

    通用分页存储过程很实用,但毕竟不是全适用于一些环境,譬如我遇到过一种情况,需要先外链两个表,然后再关联几个表,总之参数传递很烦人,这里不细说了,现在只谈实现查询后,怎么分页的简单技巧 1,建立用户函数 ...

  5. 支持DISTINCT的通用分页存储过程(SQL2005)

    /****** 对象: StoredProcedure [dbo].[P_CommonPagination] 脚本日期: 07/22/2009 10:22:01 ******/ SET ANSI_NU ...

  6. 通用分页存储过程(sqlserver)

    < DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> -- 获取指定页的数据 ...

  7. java sqlserver 分页_java+sqlserver 使用分页存储过程

    251万条数据进行查询仅需7秒左右 --此存储过程,将返回3个结果集,第一个空集,第二个信息集,第三个数据集 create procedure proc_fenye @sqlstr nvarchar( ...

  8. MS SqlServer海量数据分页存储过程收集

    CREATE PROC [dbo].[Mypage] @tableName SYSNAME,-- 表名@keyField NVARCHAR(1000),-- 主键,多个主键有逗号分隔开@pageInd ...

  9. sql2005通用分页存储过程

    set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go /****** Object: Stored Procedure dbo.p_commonList **** ...

最新文章

  1. python安装软件 No module named setuptools
  2. android导航条高度修改,Android中修改TabLayout底部导航条Indicator长短的方法
  3. python 多线程并发编程(生产者、消费者模式),边读图像,边处理图像,处理完后保存图像实现提高处理效率
  4. Codeforces Round #143 (Div. 2) C
  5. 速查mysql数据大小
  6. n1运行linux,斐讯 N1 运行 ArchLinuxARM
  7. 网络安全教程下载,呵呵
  8. 信捷plc485通信上位机_常用通信接口汇总
  9. 32 位和 64 位版本的 Office 2010 之间的兼容性,同样适用于AutoCAD的VBA兼容性--VBA 64 32 调用dll的区别
  10. 力士乐电源模块故障代码_REXROTH DRIVE博士力士乐伺服驱动器故障代码大全
  11. 灵信LED屏 二次开发C#
  12. 团队项目(一)(江山代有才人秃队)
  13. 微信小程序——map用法
  14. 等保三级收费-等保三级的办理流程
  15. (支持阿朱)安的广厦千万间 天下寒士尽欢颜
  16. 华为公司员工待遇全面揭秘
  17. 关于计算机与教育的英语作文,信息技术对教育的影响英文作文
  18. windows消息处理过程及消息钩子
  19. Java-实现动态数组(ArrayList<Integer>集合)
  20. 如何安装免费正版office

热门文章

  1. java中if判断季节_Java判断用户输入月份的季节
  2. scala连接postgre数据库
  3. LVS(7)——NAT实践
  4. 不同路径—leetcode62
  5. 解决Win7英文版显示中文乱码
  6. 第一章 PX4-Pixhawk-程序编译过程解析
  7. 关于const变量的一点理解
  8. 神经网络基础_反向传播_证明
  9. 数理统计-5.1 总体与样本
  10. printf函数与主函数问题