最近换了家新公司,但是新公司没有使用分页的存储过程。那我就自个写一个往项目上套 (效率怎么样就不怎么清楚没有详细的测试过)

CREATE PROCEDURE [dbo].[pro_common_pageList]
(
@tab NVARCHAR(MAX) ,---表名
@PrimaryKey VARCHAR(100) , --主键ID
@strFld NVARCHAR(MAX) , --字段字符串
@strWhere NVARCHAR(MAX) = ' ' , --where条件
@IsDistinct BIT ,
@PageIndex INT , --页码
@PageSize INT , --每页容纳的记录数
@Order VARCHAR(255) = ' ' , --排序字段及规则,不用加order by
@Sort VARCHAR(20) = 'desc' ,
@TotalCount INT OUTPUT --总记录数
)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @strSql VARCHAR(MAX);
IF @strFld IS NULL
OR @strFld = ' '
BEGIN
SET @strFld = '*';
END;
IF @Order IS NULL
OR @Order = ' '
BEGIN
SET @Order = @PrimaryKey;
END;
--计算总记录数
DECLARE @sqlRecordCount NVARCHAR(MAX); --得到总记录条数的语句
DECLARE @recordCount INT; --保存总记录条数的变量
DECLARE @distinct NVARCHAR(20)= ' ';
IF @IsDistinct = 1
BEGIN
SET @distinct = ' DISTINCT ';
END;
SET @sqlRecordCount = N'SELECT @recordCount=COUNT(1) FROM (SELECT '
+ @distinct + ' ' + @strFld + ' FROM ' + @tab + ' WHERE 1=1 '
+ @strWhere + ' ) AS TEMPTABLE';
EXEC sp_executesql @sqlRecordCount, N'@recordCount int output',
@recordCount OUTPUT;
SET @TotalCount = @recordCount; --数据查询
--当@PageIndex=1,使用TOP效率较快
IF @PageIndex = 1
BEGIN
SET @strSql = 'SELECT ' + @distinct + ' TOP ' + STR(@PageSize)
+ ' ' + @strFld + ',0 AS rownum FROM ' + @tab
+ ' WHERE 1=1 ' + @strWhere + ' ORDER BY ' + @Order + ' '
+ @Sort;
END;
ELSE
BEGIN
SET @strSql = 'SELECT * FROM (SELECT *, ROW_NUMBER() OVER(ORDER BY ' + @PrimaryKey
+ ') AS rownum FROM ';
--是否去重:1去重
IF @IsDistinct = 1
BEGIN
SET @strSql = @strSql + ' (SELECT DISTINCT ' + @strFld
+ ' FROM ' + @tab + ' WHERE 1=1 ' + @strWhere
+ ' ) AS S ';
END;
ELSE
BEGIN
SET @strSql = @strSql + ' ' + @tab + ' WHERE 1=1 '
+ @strWhere;
END;
SET @strSql = @strSql
+ ') AS Dwhere WHERE Dwhere.rownum BETWEEN '
+ CAST(( ( @PageIndex - 1 ) * @PageSize ) + 1 AS NVARCHAR(20));
SET @strSql = @strSql + ' AND '
+ CAST(( @PageIndex * @PageSize ) AS NVARCHAR(20));
SET @strSql = @strSql + ' ORDER BY ' + @Order + ' ' + @Sort;
END;
PRINT(@strSql)
EXEC (@strSql);
SET NOCOUNT OFF;
END;

MS SQL 分页存储过程的更多相关文章

  1. [转]关于SQL分页存储过程的分析

    [转]关于SQL分页存储过程的分析 建立一个 Web 应用,分页浏览功能必不可少.这个问题是数据库处理中十分常见的问题.经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用 ...

  2. Delphi调用SQL分页存储过程实例

    Delphi调用SQL分页存储过程实例 (-- ::)转载▼ 标签: it 分类: Delphi相关 //-----下面是一个支持任意表的 SQL SERVER2000分页存储过程 //----分页存 ...

  3. 完整SQL分页存储过程(支持多表联接)

    http://www.cnblogs.com/andiki/archive/2009/03/24/1420289.html Code/********************************* ...

  4. 真正通用的SQL分页存储过程

    关于SQL分页的问题,网上找到的一些SQL其实不能真正做到通用,他们主要是以自增长ID做为前提的.但在实际使用中,很多表不是自增长的,而且主键也不止一个字段,其实我们稍做改进就可以达到通用.这里还增加 ...

  5. 关于SQL分页存储过程的分析

    建 立一个 Web 应用,分页浏览功能必不可少.这个问题是数据库处理中十分常见的问题.经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用游标)来实现分页.但这种分页方法仅 ...

  6. SQL - 分页存储过程

    http://www.jb51.net/article/71193.htm http://www.webdiyer.com/utils/spgenerator/ create PROCEDURE [d ...

  7. 修改后的SQL分页存储过程,利用2分法,支持排序

    /****** Object: StoredProcedure [dbo].[sys_Page_v3] Script Date: 08/13/2014 09:32:28 ******/ SET ANS ...

  8. sql分页存储过程比较

    一,先创建一百万条数据 drop table #tmp create table #tmp ( id ,) primary key, name ) ) declare @i int begin ins ...

  9. MS SQL的存储过程

    -- ============================================= -- Author: -- Create date: 2016-07-01 -- Descriptio ...

随机推荐

  1. org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]

    运行servlet程序报错: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Cat ...

  2. Ubuntu中解决机箱前置耳机没声音

    Ubuntu中解决机箱前置耳机没声音 安装pavucontrol软件: sudo apt-get install pavucontrol 然后直接运行pavucontrol打开软件: 将输出设备设置为 ...

  3. 55. Jump Game (Array; Greedy)

    Given an array of non-negative integers, you are initially positioned at the first index of the arra ...

  4. 判断UNITY版本号

    代码示例: #if (UNITY_5_3 || UNITY_5_4 || UNITY_5_5 || UNITY_5_6 || UNITY_5_7 || UNITY_5_8 || UNITY_5_9)u ...

  5. MYSQL错误:You can't specify target table for update in FROM clause

    这句话意思是:不能先select再更新(修改)同一个表. 可以再外嵌套多一层,这个问题只有mysql有,mssql和oracle都没有. # 出错delete from Person where Id ...

  6. [leetcode]543. Diameter of Binary Tree二叉树直径

    Given a binary tree, you need to compute the length of the diameter of the tree. The diameter of a b ...

  7. Linux SSH基于密钥交换的自动登陆原理简介及配置说明

    一.原理简介 SSH证书认证登录的基础是一对唯一匹配密钥: 私钥(private key)和公钥(public key).公钥用于对数据进行加密,而且只能用于加密.而私钥只能对使用所匹配的公钥,所加密 ...

  8. java的PDF纵横向打印

    PDF默认是纵向打印的,通过rotate()来让其改变为横向打印,一般在打印A4 12*21纸以及发票的时候会用横向打印.横向打印时页面会出现行转列以及列转行的情况,因此在设置页面大小的时候一定要宽度 ...

  9. dede中arcurl的解析

    有时候我们需要在dede中通过$dsql查询出文章数据,并生成文章的地址. 但是dede默认的dede_archives和附加表dede_addonarticle都没有存放arcurl的字段. 说明a ...

  10. 【深度好文】多线程之WaitHandle-->派生-》Mutex信号量构造

    bool flag = false; System.Threading.Mutex mutex = new System.Threading.Mutex(true, "Test", ...