set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
GO 
/* 
分页排序存储过程 V1.0 
*/

ALTER procedure [dbo].[sp_KeyPage] 
@tbname    sysname,              --要分页显示的表名 
@FieldKey  nvarchar(1000),      --用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段 
@PageCurrent int=1,              --要显示的页码 
@PageSize  int=10,                --每页的大小(记录数) 
@FieldShow nvarchar(1000)='',      --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段 
@FieldOrder nvarchar(1000)='',      --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC                                    --  用于指定排序顺序 
@Where    nvarchar(1000)='',    --查询条件 
@PageCount int OUTPUT            --总页数 
AS 
--检查对象是否有效 
IF OBJECT_ID(@tbname) IS NULL --OBJECT_ID 功能:返回数据库对象的标识号 
BEGIN 
    RAISERROR(N'对象"%s"不存在',1,16,@tbname) 
    RETURN 
END 
IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0 --OBJECTPROPERTY 功能:返回当前数据库中对象的有关信息。 
    AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0 
    AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0 
BEGIN 
    RAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname) 
    RETURN 
END 
--分页字段检查 
IF ISNULL(@FieldKey,N'')='' 
BEGIN 
    RAISERROR(N'分页处理需要主键(或者惟一键)',1,16) 
    RETURN 
END 
--其他参数检查及规范 
IF ISNULL(@PageCurrent,0) <1 SET @PageCurrent=1 
IF ISNULL(@PageSize,0) <1 SET @PageSize=10 
IF ISNULL(@FieldShow,N'')=N'' SET @FieldShow=N'*' 
IF ISNULL(@FieldOrder,N'')=N'' 
    SET @FieldOrder=N'' 
ELSE 
    SET @FieldOrder=N'ORDER BY '+LTRIM(@FieldOrder) 
IF ISNULL(@Where,N'')=N'' 
    SET @Where=N'' 
ELSE 
    SET @Where=N'WHERE ('+@Where+N')' 
--如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值) 
IF @PageCount IS NULL 
BEGIN 
    DECLARE @sql nvarchar(4000) 
    SET @sql=N'SELECT @PageCount=COUNT(*)' 
        +N' FROM '+@tbname 
        +N' '+@Where 
    EXEC sp_executesql @sql,N'@PageCount int OUTPUT',@PageCount OUTPUT 
    SET @PageCount=(@PageCount+@PageSize-1)/@PageSize 
END 
--计算分页显示的TOPN值 
DECLARE @TopN varchar(20),@TopN1 varchar(20) 
SELECT @TopN=@PageSize, 
    @TopN1=(@PageCurrent-1)*@PageSize 
--第一页直接显示 
IF @PageCurrent=1 
    EXEC(N'SELECT TOP '+@TopN 
        +N' '+@FieldShow 
        +N' FROM '+@tbname 
        +N' '+@Where 
        +N' '+@FieldOrder) 
ELSE 
BEGIN 
    --处理别名 
    IF @FieldShow=N'*' 
        SET @FieldShow=N'a.*'

--生成主键(惟一键)处理条件 
    DECLARE @Where1 nvarchar(4000),@Where2 nvarchar(4000), 
        @s nvarchar(1000),@Field sysname 
    SELECT @Where1=N'',@Where2=N'',@s=@FieldKey 
    WHILE CHARINDEX(N',',@s)>0 
        SELECT @Field=LEFT(@s,CHARINDEX(N',',@s)-1), 
            @s=STUFF(@s,1,CHARINDEX(N',',@s),N''), 
            @Where1=@Where1+N' AND a.'+@Field+N'=b.'+@Field, 
            @Where2=@Where2+N' AND b.'+@Field+N' IS NULL', 
            @Where=REPLACE(@Where,@Field,N'a.'+@Field), 
            @FieldOrder=REPLACE(@FieldOrder,@Field,N'a.'+@Field), 
            @FieldShow=REPLACE(@FieldShow,@Field,N'a.'+@Field) 
    SELECT @Where=REPLACE(@Where,@s,N'a.'+@s), 
        @FieldOrder=REPLACE(@FieldOrder,@s,N'a.'+@s), 
        @FieldShow=REPLACE(@FieldShow,@s,N'a.'+@s), 
        @Where1=STUFF(@Where1+N' AND a.'+@s+N'=b.'+@s,1,5,N''),    
        @Where2=CASE 
            WHEN @Where='' THEN N'WHERE (' 
            ELSE @Where+N' AND (' 
            END+N'b.'+@s+N' IS NULL'+@Where2+N')' 
--执行查询 
    EXEC(N'SELECT TOP '+@TopN 
        +N' '+@FieldShow 
        +N' FROM '+@tbname 
        +N' a LEFT JOIN(SELECT TOP '+@TopN1 
        +N' '+@FieldKey 
        +N' FROM '+@tbname 
        +N' a '+@Where 
        +N' '+@FieldOrder 
        +N')b ON '+@Where1 
        +N' '+@Where2 
        +N' '+@FieldOrder) 
END

转载于:https://www.cnblogs.com/qiantuwuliang/archive/2009/07/19/1526657.html

SqlServer分页排序存储过程 V1.0相关推荐

  1. [ MSSQL ]分页排序存储过程

    第一种方案,我们先取集集合OB,这可以用一个使用SELECT TOP 并使用升级排列的语句完成 然后对OB结果集进行倒序排序,再用"SELECT TOP 每页记录数"倒序 的方式取 ...

  2. sqlserver 分页存储过程

    --分页 --求  共多少页pageCount   当前页的数据 --已知  1 每页显示几条   pageSize    2 当前页码 pageIndex select 6/3 select CEI ...

  3. .NET ORM FreeSql 第一个正式版本发布 v1.0.0

    一.简介 FreeSql 是 .NET 平台下的对象关系映射技术(O/RM),支持 .NetCore 2.1+ 或 .NetFramework 4.0+ 或 Xamarin. 从 0.0.1 发布到今 ...

  4. 实现小数据量和海量数据的通用分页显示存储过程

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

  5. SQL Server 的通用分页显示存储过程

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

  6. 数据库:SQLServer分页查询整理

    作为程序员来说,与数据库打交道是十分频繁的分页查询是一个开发者必须掌握的基本知识点,目前整理了下面三种SQLServer分页查询语句的写法,仅供参考. 一.Top Not IN 方式(查询靠前的数据较 ...

  7. 三种SQLServer分页查询语句笔记

    作为程序员来说,与数据库打交道是十分频繁的分页查询是一个开发者必须掌握的基本知识点,目前整理了下面三种SQLServer分页查询语句的写法,仅供参考. 一.Top Not IN 方式(查询靠前的数据较 ...

  8. 小量数据和海量数据分页显示存储过程

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

  9. 一扬开源新闻静态生成系统V1.0发布

    这是我写的第一个开源系统,我最初的设想是在这个系统应用上尽量多的技术,当然现在这个设想也没有改变,现在发布的只是V1.0版,里面涉及了静态生成,模板应用,存储过程,DIV+CSS,反射,集合,XML, ...

最新文章

  1. Python 网络服务相关 杂记
  2. Codeforces Round #297 (Div. 2)C. Ilya and Sticks 贪心
  3. flex 动态显示时间
  4. canopy算法流程_求助,kmeans(Canopy)算法如何正确导入数据集
  5. Windows用户安全小技巧
  6. 如何让Docker镜像飞起来
  7. js求渐升数的第100位
  8. 集合里面的 E是泛型 暂且认为是object
  9. Jsoup消除不受信任的HTML(用于防止XSS的攻击)
  10. python 基础 集合
  11. 修复Git打包的一个Bug
  12. 伺服驱动器上UVW电机动力线相序接错
  13. C++中两个栈实现一个队列
  14. 手把手教你领取永久免费服务器
  15. 【FXCG】多头陷阱知多少
  16. Spring 依赖注入的理解及三种注入方式
  17. Echarts基础圆环图
  18. python实现基于贪婪算法的多技能工人任务分配问题
  19. 软件测试工程师面试题答案分类详解-深圳某老牌培训机构内部绝密文件!绝密文件!绝密文件!
  20. python暴力破解压缩包密码(python暴力破解zip压缩包)

热门文章

  1. 遇见BUG(2)去掉你的增量编译使能!
  2. 傅里叶分析中的时频域之间的关系(以及一点对于DFT的一点思考)
  3. Ant Design 3.16.2 发布,企业级 UI 设计语言
  4. 算法笔记之分支限界法
  5. 当我们输入一条SQL查询语句时,发生了什么?
  6. 关于tomcat无法启动问题详解
  7. 转载----Python的zip()函数
  8. 【练习】OC语法的简单复习
  9. 【转载】网络视频企业探索盈利模式 PPS研发新展示系统
  10. oracle 常用命令大汇总