• 分页存储过程(二):分页获得多表连接查询的数据 (未验证)


    -------------------------------------------------------------------------
    -- 名称(Name):GetRecordFromTableWithSimpleJoinByPage
    -- 功能(Function):分页获得多表连接查询的数据
    -- 书写者(Author):
    -- 日期(Date):2006年02月15日
    -- 输入参数:
    /*
        @tblName      nvarchar(255),        -- 表名
        @priKeyName      nvarchar(50),        -- 主键列
        @fldNames     nvarchar(1000),       -- 要取值的字段名,多个字段通过逗号分割
        @PageSize     int = 0,              -- 页尺寸,0表示不需要分页
        @PageIndex    int = 1,              -- 页码,从1开始
        @OrderType    nvarchar(200) = '',   -- 设置排序,'':没有排序要求 0:主键升序 1:主键降序 else:用户自定义排序规则
        @strWhere     nvarchar(2000) = '',  -- 查询条件 (注意: 不要加 where)
        @strJoin      nvarchar(1000) = '',    -- 连接表
    */
    --输出参数:
    --    @TotalItem int output,    -- 总的记录数
    --    @TotalPage int output    -- 总的页数    
    -- 说明: 
    -- (1) 当多个表简单的连接时,可以使用该存储过程
    -- (2) 需要注意的是多个表参与查询时,要查询的字段最好附带表名,
    -- (3) 排序规则要建立在主表上
    -- (4) 适用于使用左外连接,这样连接的表不参与建立排序
    -------------------------------------------------------------------------
    -- 修改者:
    -- 修改日期:
    -- 修改说明:
    -------------------------------------------------------------------------
    ALTER        PROCEDURE [dbo].[GetRecordFromTableWithSimpleLeftOuterJoinByPage]
        @tblName      nvarchar(255),        -- 表名
        @priKeyName      nvarchar(50),        -- 主键列或标示列
        @fldNames     nvarchar(1000),       -- 字段名,多个字段通过逗号分割
        @totalflds    nvarchar(500),
        @PageSize     int,              -- 页尺寸
        @PageIndex    int,              -- 页码
        @OrderType    nvarchar(200),   -- 设置排序,'':没有排序要求 0:主键升序 1:主键降序 字符串:用户自定义排序规则
        @strWhere     nvarchar(2000),  -- 查询条件 (注意: 不要加 where)
        @strJoin      nvarchar(1000),    -- 连接表
        @TotalItem int output,    
        @TotalPage int output
    AS
    
    declare @strByPage   nvarchar(4000)   -- 分页查询语句
    declare @strNoPage nvarchar(1500)      -- 不分页查询语句,获得所有符合条件的记录
    declare @strTotal nvarchar(1000)      -- 统计符合条件的纪录数
    declare @strNonResult nvarchar(1500)  -- 返回空记录的语句
    declare @strTmp nvarchar(100)
    declare @strOrder nvarchar(200)
    declare @strSql nvarchar(4000)
    
    if @OrderType is null or @OrderType=''
    begin
        set @strOrder = ''
        set @strTmp=''
    end
    else if @OrderType = '0' -- 降序
    begin
        set @strTmp = @tblName + '.' + @priKeyName + '>(select max([' + @priKeyName + ']) from '
        set @strOrder = ' order by ' + @tblName + '.' + @priKeyName + ' asc'
    end
    else if @OrderType = '1' -- 降序
    begin
        set @strTmp = @tblName + '.' + @priKeyName + '<(select min([' + @priKeyName + ']) from '
        set @strOrder = ' order by ' + @tblName + '.' + @priKeyName + ' desc'
    end
    else -- 用户自定义排序规则
    begin
        set @strTmp = ''
        set @strOrder = ' order by ' + @OrderType
    end
    
    set @strJoin = ' ' + @strJoin + ' '
    set @strNonResult = 'select ' + @fldNames + ' from ' + @tblName + @strJoin + ' where 1=2'
    
    
    if @strWhere is null or @strWhere = '' -- 如果没有额外的查询条件
    begin
        set @strTotal = N'select @TotalItem = count(*) from ' + @tblname + @strJoin
        set @strNoPage = N'select ' + @fldNames + ' from ' + @tblName + @strJoin + @strOrder
    end
    else
    begin
        set @strTotal = N'select @TotalItem = count(*) from ' + @tblname + @strJoin + ' where ' + @strWhere
        set @strNoPage = N'select ' + @fldNames + ' from ' + @tblName + @strJoin + ' where ' + @strWhere + @strOrder
    end
    
    -- 取得所有符合查询条件的记录数
    --print @strTotal
    exec sp_executeSql @strTotal,N'@TotalItem int output',@TotalItem output
    -- 如果没有适合条件的记录时,提供一个空的记录集并退出查询
    if @TotalItem = 0
    begin
        set @TotalPage = 0
       set @strSql = @strNonResult
        --exec sp_executeSql @strNonResult    
    end
    else
    begin
       -- 执行查询,此时记录集不为空
       if @PageSize = 0   -- 当不需要分页时
       begin
           --set nocount off
           set @TotalPage = 0
          set @strSql = @strNoPage
           --exec sp_executeSql @strNoPage
       end
       else    -- 当需要分页时
       begin
           --set nocount off
           -- 得到记录的页数,并调整页号,分页从1开始
           set @TotalPage=CEILING(cast(@TotalItem as float)/@PageSize)
           if(@PageIndex>@TotalPage)
               set @PageIndex=@TotalPage
           if(@PageIndex <1)
               set @PageIndex=1
       
           if @PageIndex =1    -- 如果是第一页
           begin
               if @strWhere=''
             begin
                   set @strByPage = N'select top ' + cast(@PageSize as varchar) + ' ' + @fldNames + ' from ' + @tblName + @strJoin + @strOrder
             end
               else
             begin
                   set @strByPage = N'select top ' + cast(@PageSize as varchar) + ' ' + @fldNames + ' from ' + @tblName + @strJoin + ' where ' + @strWhere + @strOrder
             end
           end
           else    -- 以后页
           begin
               
               if (@OrderType='0' or @OrderType='1') -- 按主键升序或降序
               begin
                   if @strWhere=''
                       set @strByPage = N'select top ' + cast(@PageSize as varchar) + ' ' + @fldnames 
                           + ' from ' + @tblName 
                           + @strJoin
                           + ' where ' + @strTmp
                           + ' (select top ' + cast((@PageIndex-1) * @PageSize as varchar) + ' ' + @priKeyName 
                           + ' from ' + @tblName + @strJoin + @strOrder + ') as tmptbl)'
                           + @strOrder
                   else
                       set @strByPage = N'select top ' + cast(@PageSize as varchar) + ' ' + @fldnames 
                           + ' from ' + @tblName 
                           + @strJoin
                           + ' where ' + @strTmp
                           + ' (select top '+ cast((@PageIndex-1) * @PageSize as varchar) + ' ' + @priKeyName 
                           + ' from ' + @tblName +  @strJoin + ' where ' + @strWhere + @strOrder + ') as tmptbl)'
                           + ' and ' + @strWhere
                           + @strOrder
               end
               else  -- 没有排序规则或者用户自定义规则
               begin 
                   if @strWhere=''
                       set @strByPage = N'select top ' + cast(@PageSize as varchar) + ' ' + @fldnames 
                           + ' from ' + @tblName 
                           + @strJoin
                           + ' where not exists (select * from '
                           + '    (select top ' + cast((@PageIndex-1) * @PageSize as varchar) + @tblName + '.'+ @prikeyName 
                           + ' from ' 
                           + @tblName + @strJoin + @strorder + ') as tmpTable '
                           + ' where tmpTable.' + @priKeyName + ' = ' + @tblName +'.' + @priKeyName + ')'
                           + @strorder
                   else
                       set @strByPage = N'select top ' + cast(@PageSize as varchar) + ' ' + @fldnames 
                           + ' from ' + @tblName 
                           + @strJoin
                           + ' where not exists (select * from '
                           + '    (select top ' + cast((@PageIndex-1) * @PageSize as varchar) + @tblName + '.'+ @prikeyName 
                           + ' from ' 
                           + @tblName + @strJoin + ' where ' + @strWhere + @strorder + ') as tmpTable '
                           + ' where tmpTable.' + @priKeyName + ' = ' + @tblName + '.' + @priKeyName + ')'
                           + ' and ' + @strWhere
                           + @strorder
               end
           end
       
       end
       
       set @strSql = @strByPage
       -- exec sp_executeSql @strByPage
    end
    --print @strSql
    exec sp_executeSql @strSql
    
    if @totalflds is not null and @totalflds !=''
    begin
        declare @strTotalfld nvarchar(2000)
        if (@strWhere is null or @strWhere='')
        begin
            set @strTotalfld = 'select ' + @totalflds + ' from ' + @tblName
        end
        else
        begin
            set @strTotalfld = 'select ' + @totalflds + ' from ' + @tblName + ' where ' + @strWhere
        end
        exec sp_executeSql @strTotalfld
    end
    return  
  • 相关阅读:
    Selenium + WebDriver 各浏览器驱动下载地址
    selenium之 文件上传所有方法整理总结【转】
    FakeUserAgentError('Maximum amount of retries reached') 彻底解决办法
    git关联远程仓库
    通过chrome console 快速获取网页连接
    【转】Selenium
    【转】fiddler抓包HTTPS请求
    【转】Wireshark和Fiddler分析Android中的TLS协议包数据(附带案例样本)
    php 通过 create user 和grant 命令无法创建数据库用户和授权的解决办法
    差等生也是需要交卷的
  • 原文地址:https://www.cnblogs.com/beeone/p/3598660.html
Copyright © 2020-2023  润新知