/**********************************************************************

参数:@PrimaryKey 主键,@OrderBy 排序字段,@SqlStr sql语句,@PageSize 每页显示的记录,@PageIndex 当前页(从0开始)

***********************************************************************/

ALTER procedure [dbo].[PageQuery]

@PrimaryKey varchar(100),--主键

@OrderBy varchar(100),--排序字段

@SqlStr varchar(8000),--sql语句

@PageSize int,--每页显示的记录

@PageIndex int--当前页(从1开始)

--@RecordCount int output --返回的总记录数

as

declare @ExecSql varchar(8000)--要执行的Sql组合

if @OrderBy=''

set @OrderBy='order by '+@PrimaryKey+' asc'

else if (len(@OrderBy)<8 or upper(substring(@OrderBy,1,8))<>'ORDER BY')

set @OrderBy='order by '+@OrderBy

if @PageSize=-1--用于ajax的第一次查询

set @PageSize=0

set @PageIndex=@PageIndex-1

print('-----'+CAST(@PageIndex as varchar(10)) )

begin

declare @recordCount int,@pageCount int

declare @s nvarchar(4000)

set @s = N'select @recordCount = count('+@PrimaryKey+') from ('+@SqlStr+') TN'

exec sp_executeSql @s,N'@recordCount int output',@recordCount output

if(@pageSize>0)

set @pageCount = (@recordCount - 1 + @PageSize) / @PageSize;--总页数

else

set @pageCount = 0;--总页数

	if @PageIndex<=0--如果是第一页就执行这个
begin
set @ExecSql='select top '+cast(@PageSize as varchar(100))+' * from ('+@SqlStr+') T '+@OrderBy
end
else
begin
if charindex('2000 - 8.00.',@@version)>0
begin
set @ExecSql=
'select top '+cast(@PageSize as varchar(100))+' *
from ('+@SqlStr+') as T where T.'+@PrimaryKey+' not in
(select top '+cast((@PageSize*@PageIndex) as varchar(100))+' '+@PrimaryKey+'
from ('+@SqlStr+') T2 '+@OrderBy+') '+ @OrderBy
end
else
begin
set @ExecSql=
'select * from
(
select * from
(SELECT *, #RowNum#=ROW_NUMBER() OVER('+@OrderBy+') FROM ('+@SqlStr+') T1) T2 where T2.#RowNum#>='+cast(@PageSize*@PageIndex+1 as varchar(10))+' and T2.#RowNum#<='+cast(@PageSize*(@PageIndex+1) as varchar(10))+'
) T3
'
end
end
exec (@ExecSql+' select '+@recordCount+' as RecordCount,'+@pageCount+' as PageCount ')

end

SQLServer 高效 分页存储过程的更多相关文章

  1. sql server 2000 单主键高效分页存储过程 (支持多字段排序)

    sql server 2000 单主键高效分页存储过程 (支持多字段排序) Create PROC P_viewPage             /*              nzperfect [ ...

  2. SQLserver 的分页存储过程

      -- 1.建立修改学生数据的存储过程 -- 2.建立根据班级Id和学生姓名模糊查询的分页存储过程,要求正确输出总记录数,总页数-- (输入班学生姓名 计算总记录数 计算总页数) -- @name ...

  3. SQlserver高效分页,还在使用row_number(),top之类的?

    row_number() ,还是top 这些分页的方法比较老了,效率不是很高效的, Sqlserve2012就有了,效率对比比较明显,尤其是数据比较大的情况下(我们可以观看查询执行计划) Offset ...

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

    USE [AAA_TYDC] GO /****** Object: StoredProcedure [dbo].[proc_DataPagination] Script Date: 11/20/201 ...

  5. sqlserver 通用分页存储过程

    来源:http://www.jb51.net/article/19936.htm CREATE PROCEDURE commonPagination ), --要显示的列名,用逗号隔开 ), --要查 ...

  6. 【转】ASP.NET 高效分页存储过程

    代码 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-- ...

  7. oracle高效分页存储过程(百万数据级)

    create or replace procedure Pager( page in number,--数据页数,从1开始 pageSize in number,--每页大小 tableName nv ...

  8. 高效sql2005分页存储过程

    高效分页存储过程 --分页存储过程示例 Alter PROCEDURE [dbo].[JH_PageDemo] @pageSize int = 9000000000, @pageIndex int = ...

  9. 完整的分页存储过程以及c#调用方法

    高效分页存储过程 USE [db] GO /****** 对象: StoredProcedure [dbo].[p_Page2005] 脚本日期: // :: ******/ SET ANSI_NUL ...

随机推荐

  1. 4-1-JS数据类型及相关操作

    js的数据类型 判断数据类型 用typeof   typeof "John"                 // alert(typeof "John") 返 ...

  2. [N久以前发布的文章]php 获取yahoo股票csv数据并封闭成为接口输出json数据

    思路 先从yahoo接口获取数据,再定义接口,转化成为json输出.只供卡通网(kt5.cn)使用 stock.php 接口处理代码 <?php header("Content-Typ ...

  3. wamp环境下composer及laravel的安装配置

    laravel: PHP Web开发框架 composer: PHP 的一个依赖管理工具.它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们. 一.composer安装 参考:Windows ...

  4. jira Licenses更新步骤

    有时候我们不想花钱使用jira,那么只有通过一个月以续期的方式来使用jira.下面提供下自己实测的方式 1.获取License Key 登录地址:https://my.atlassian.com 登录 ...

  5. 删除带外键的表【foreign key constraint fails】报错

    title: 删除带外键的表[foreign key constraint fails]报错 date: 2018-08-02 21:59:06 tags: 数据库 --- 遥想当时正在学hibern ...

  6. 5-2可视化库Seaborn-调色板

    In [1]: import numpy as np import seaborn as sns import matplotlib.pyplot as plt %matplotlib inline ...

  7. 初学JavaScript正则表达式(五)

    范围类 [ ] 例: 'a1b1c1s1v1d1f1'.replace(/[a-z]/g,'q') //q1q1q1q1q1q1q1 将a-z范围内的字符替换为q 'a1b1c1s1v1d1f1AKS ...

  8. Pwn-pwn-100

    题目地址http://www.whalectf.xin/files/2779dd8a2562a1d5653c5c6af9791711/binary_100 32位 ,没有防护 上IDA 很简单的栈溢出 ...

  9. 让人又爱又恨的this

    this是个神奇的东西, 既可以帮助我们把模拟的类实例化. 又可以在事件绑定里准确指向触发元素. 还可以帮助我们在对象方法中操作对象的其他属性或方法. 甚至可以在使用apply.call.bing.f ...

  10. 【2019.8.8 慈溪模拟赛 T2】query(query)(分治+分类讨论)

    分治 首先,我们考虑分治处理此问题. 每次处理区间\([l,r]\)时,我们先处理完\([l,mid]\)和\([mid+1,r]\)两个区间的答案,然后我们再考虑计算左区间与右区间之间的答案. 处理 ...