• 找到个不错的分组分页SQL存储过程,保留下来备忘


    USE [Voting]
    GO
    /****** 对象:  StoredProcedure [dbo].[syspr_TablePaginationSearch]    脚本日期: 01/25/2010 14:32:06 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    create procedure [dbo].[syspr_TablePaginationSearch]
    (
    @SelectField nvarchar(512)='*'     -- Select语句字段,调用的时候不要输入"select"
    ,@FormTables nvarchar(512)      -- Form子句,表名,包括架构名,调用的时候不要输入"from"
    ,@WhereField nvarchar(512)=null     -- Where语句、判断字段,调用的时候不要输入"where"
    -----------------------------------------------------
    ,@OverPartitionField nvarchar(512)=null   -- 分区字段,
    ,@OverOrderField nvarchar(512)     -- 分页字段,主要排序字段,必须
    ,@GroupField nvarchar(512)=null     -- 分组字段
    ,@HavingField nvarchar(512)=null    -- 分组判断条件
    ,@OrderField nvarchar(512)=null     -- 排序字段
    -----------------------------------------------------
    ,@PageSize int=10        -- 页长
    ,@Page int=1         -- 页
    -----------------------------------------------------
    ,@ErrorProcedure nvarchar(128)=null output -- 错误存储过程名
    ,@ErrorNumber int=0 output      -- 错误编号
    ,@ErrorMessage nvarchar(512)=null output -- 错误信息
    )
    as
    begin
    --定义第一行记录
    declare @firstRow int;
    --定义最后一条记录
    declare @lastRow int;--设置第一条记录
    set @firstRow=((@Page-1)*@PageSize)+1;
    --设置最后一条记录
    set @lastRow=@firstRow+@PageSize;--定义查询SQL字段
    declare @sqlString nvarchar(512);
    --定义Select语句,内查询使用
    declare @selectString nvarchar(512);
    --定义Where字段,内查询使用
    declare @whereString nvarchar(512);
    --定义Form子句,内查询使用
    declare @formString nvarchar(512);
    --定义分组字段,内查询使用
    declare @groupString nvarchar(512);
    --定义Having子句,内查询使用
    declare @havingString nvarchar(512);
    --定义排序字段,外查询使用
    declare @OrderString nvarchar(512);--组装Select子句-----------------------------------
    set @SelectField=isnull(@SelectField,N' * ');
    if(@SelectField='')
       set @SelectField=N' *' ;
    --组装select子句到row_number()
    set @selectString=N' select '+ @SelectField+ ', Row_Number() over( ';
    --组装到分区partition by 表达式
    set @OverPartitionField=isnull(@OverPartitionField,N'');
    if (@OverPartitionField<>'')
       set @selectString= @selectString+ ' partition by '+ @OverPartitionField;
    --组装到排序分页order by 表达式
    set @OverOrderField=isnull(@OverOrderField,N'');
    if (@OverOrderField<>'')
       set @selectString= @selectString+ ' order by '+ @OverOrderField+ N') as RowNumber ';
    --over---------------------------------------------
    --组装Form子句------------------------------------
    set @formString= N' from '+ @FormTables;
    --组装Where判断子句------------------------------
    set @WhereField=isnull(@WhereField,N'');
    if(@WhereField<>'')
       set @whereString=N' where '+ @WhereField;
    else
       set @whereString=N'';
    --where判断子句组装完毕-------------------------
    --组装group by分组子句--------------------------
    set @GroupField=isnull(@GroupField,N'');
    if (@GroupField<>'')
    begin
       set @groupString= N' group by '+ @GroupField;   --组装having分组判断条件
       set @HavingField= isnull(@HavingField,N'');
       if (@HavingField<> N'')
        set @havingString= N' having '+ @HavingField;
       else
        set @havingString=N'';
    end
    else
    begin
       set @groupString= N'';
       set @havingString=N'';
    end
    --over-------------------------------------------
    --组装order by外排序子句-----------------------
    set @OrderField=isnull(@OrderField,N'');
    if (@OrderField<>'')
       set @OrderString= N' order by '+ @OverOrderField+ N' , '+ @OrderField;
    else
       set @OrderString= N'';
    --如果@groupString不为空,则外排序不起作用
    if (@groupString<>N'')
       set @OrderString=N'';
    --over-------------------------------------------
    --组装分页查询语句
    set @sqlString=
       N'select * '+
       N'from '+
       N' ( '+
        @selectString+
        @formString+
        @whereString+
        @groupString+
        @havingString+
       N' ) as TB '+
       N'where '+
       N' TB.RowNumber>='+cast(@firstRow as nvarchar(10))+
       N' and TB.RowNumber<'+cast(@lastRow as nvarchar(10))+
       @orderString
    --over-------------------------------------------
    --执行SQL,返回影响行数;如有异常,则抛出,并赋值输出参数
    begin try
       print @sqlString
       exec (@sqlString);
       return @@rowcount;
    end try
    begin catch
       set @ErrorProcedure=Error_Procedure();
       set @ErrorNumber=error_number();
       set @ErrorMessage=error_message();
    end catch;end

    /*
    go-----------------------------------------------------------
    --简单的测试,查询AdventureWorks库的Person.Address表。
    --以addressid字段顺序分页、并按PostalCode ,StateProvinceID等字段排序。
    exec dbo.syspr_TablePaginationSearch
    @SelectField='*'
    ,@FormTables='AdventureWorks.Person.Address'
    ,@whereField='addressid>100'
    ,@OverOrderField='addressid asc'
    ,@OrderField='PostalCode ,StateProvinceID'
    ,@Page=1
    ,@PageSize=10
    go
    --简单的测试,分组统计addressid字段,并分页显示结果集。exec dbo.syspr_TablePaginationSearch
    @SelectField='count(addressid) as addressCount,city'
    ,@FormTables='AdventureWorks.Person.Address'
    ,@OverOrderField='count(addressid) desc'
    ,@GroupField='city'
    ,@Page=1
    ,@PageSize=10
    go
    --连接查询并分页
    exec dbo.syspr_TablePaginationSearch
    @SelectField=N'
       addr.AddressLine1,
       addr.AddressLine2,
       addr.City,
       sp.Name as ProvinceName,
       addr.PostalCode,
       addr.rowguid,
       addr.ModifiedDate'
    ,@FormTables=N'
       AdventureWorks.Person.Address as addr
       inner join
       AdventureWorks.Person.StateProvince as sp
        on addr.StateProvinceID=sp.StateProvinceID'
    ,@OverOrderField='addressid asc'
    ,@Page=1
    ,@PageSize=10
    go
    */

  • 相关阅读:
    Elasticsearch的介绍与安装配置启动问题
    代码发布项目
    gitpython模块
    Paramiko模块
    gojs插件的介绍与使用
    django中如何实现websocket,真正通过websocket实现群聊功能
    如何实现服务端主动给客户端推送消息,websocket详解,以及django如何使用websocket问题
    简单爬取汽车之家新闻(requests模块+bs4)
    http协议版本,响应状态码,正反向代理的区别,与伪静态
    web开发经验——富头像上传编辑器的使用
  • 原文地址:https://www.cnblogs.com/wyxy2005/p/1655896.html
Copyright © 2020-2023  润新知