zoukankan      html  css  js  c++  java
  • SQL分页查询笔记


    SQL分页查询的写法,网上流传比较广的有这么三种

      1.是利用Max(或者Min)函数

      2.利用游标

      3.利用not in

    至于效率也是各有各说法,我没去实际的比较,不好妄论。恰逢今天在处理个分页。顺便记录下我的做法(其实也就是第一种,利用min函数)

    先说下业务场景:

      客户端请求当前数据之前的一部分数据,而这部分数据跟当前数据的关系在于时间上是连续的。在数据库中表现为:按照时间来排序的查询中,这两部分数据是前后顺序的

    而这跟普通的分页不一样的地方在于:普通的分页只要关系全部数据的计算,而我这边需要有个标示来说,数据查询的起始位置。其实差异很小

    CREATE PROCEDURE [dbo].[spThemeTopList]
    (
        @page_size nvarchar(5),                   -- 一页记录数
        @page_index nvarchar(5),                  -- 当前页数
        @max_id nvarchar(50),                     -- 目前最大id
        @type_id nvarchar(5),                     -- 主题类型 
        @userid nvarchar(50)                      -- 用户id
    )
    AS
    BEGIN
        DECLARE 
            @WhereStr nvarchar(4000),
            @sqlStr nvarchar(4000)
        --userid 有可能为空,这边坐个判断
        IF @userid<>''
            BEGIN
                set @WhereStr = ' AND t.UserId='''+@userid+''''
            END
    
    --- 首次加载数据时,[@max_id] 与 [@page_index] 都为0 则默认取 数据库最前面 [@page_size] 条
    -- 'SELECT TOP '+ @page_size +'
        IF(@page_index=0)
            BEGIN
                set @sqlStr = 'SELECT TOP '+ @page_size+' t.ThemeId,t.ThemeTitle AS title,t.UserId,t.ThemeContent AS body, 
                            t.ThemeTime,u.UserName AS [name],u.ImagePath AS headId,t.ImagePath AS picId 
                            FROM [Theme] t LEFT JOIN [User] u ON t.UserId=u.UserId WHERE t.TypeId= '''
                            + @type_id +'''' + @WhereStr + ' ORDER BY t.ThemeId DESC'
            END
        ELSE
            BEGIN
                set @sqlStr = 'SELECT TOP '+ @page_size +' t.ThemeId,t.ThemeTitle AS title,t.UserId,t.ThemeContent AS body,
                            t.ThemeTime,u.UserName AS [name],u.ImagePath AS headId,t.ImagePath AS picId
                            FROM [Theme] t LEFT JOIN [User] u ON t.UserId=u.UserId
                            WHERE t.TypeId= ''' + @type_id +''' AND t.ThemeId<(SELECT MIN(t3.ThemeId)
                            FROM (SELECT TOP '+ cast((cast(@page_size as int) * cast(@page_index as int)) as nvarchar(5))  
                            +' t2.ThemeId FROM [Theme] t2 WHERE t2.ThemeId< '''+@max_id+'''  order by t2.ThemeId DESC) t3)'
                            + @WhereStr + 'ORDER BY t.ThemeId DESC '
            END
    END
    
    exec (@sqlStr)

    另外,很吐血的是,@page_size 这个参数,竟然不能定义为int型,会报Select Top 不能从varchar转换成int型,这个错。不知道是什么原因,有空可以研究下。

    所以只能定义成nvarchar,后续的计算在来转换,有点蛋疼,需要转换两次

  • 相关阅读:
    若依启动非常慢
    【转】上火了一吃就好的食物
    实型输入控制
    【转】中国地理的几个概念
    如何在阅读邮件时时保留原有html格式正文的样式
    好的代码不是设计出来的,而是重构出来的
    .net用OLEDB方式操作SqlServer和Sybase
    悬浮框实现
    C#操作xml SelectNodes,SelectSingleNode总是返回NULL 与 xPath 介绍
    ODBC驱动重新注册
  • 原文地址:https://www.cnblogs.com/haiyidao/p/2761050.html
Copyright © 2011-2022 走看看