• 子查询分页


    分页的sql脚本是2013年大实训的时候老师讲的,今天把它整理出来。

    数据库就用Northwind数据库。就用Orders表为例子吧,假设每页都显示10条记录。

    先从简单的脚本开始吧。先取到第一页的数据。

    SELECT TOP 10 * FROM dbo.Orders

    第二页的数据

    SELECT TOP 10 * FROM dbo.Orders WHERE OrderID NOT IN (SELECT TOP 10 OrderID FROM dbo.Orders)

    第三页的数据

    SELECT TOP 10 * FROM dbo.Orders WHERE OrderID NOT IN (SELECT TOP 20 OrderID FROM dbo.Orders)

     由此可以推断出,第N页的数据为

    SELECT TOP 10 * FROM dbo.Orders WHERE OrderID NOT IN (SELECT TOP (N-1)*10 OrderID FROM dbo.Orders)

    写成通用的SQL语句如下:

    BEGIN
        DECLARE @PageSize INT   --每页显示条数
        DECLARE @PageIndex INT    --页码(从1开始)
        SET @PageSize = 10
        SET @PageIndex = 4
        SELECT TOP ( @PageSize )
                *
        FROM    dbo.Orders
        WHERE   OrderID NOT IN ( SELECT TOP ( ( @PageIndex - 1 ) * @PageSize )
                                        OrderID
                                 FROM   dbo.Orders
                                 ORDER BY OrderID ASC )
        ORDER BY OrderID ASC
    END

    写成存储过程如下:

    --存储过程
    CREATE PROCEDURE P_GetPagedOrders1
        @PageSize INT ,             --每页显示条数
        @PageIndex INT ,            --页码(从1开始)
        @RecordCount INT OUTPUT ,    --数据总数
        @PageCount INT OUTPUT        --总页数
    AS
        BEGIN
            --获取数据总数
            SELECT  @RecordCount = COUNT(1)
            FROM    dbo.Orders
            --计算总页数
            SET @PageCount = @RecordCount / @PageSize
            IF @RecordCount % @PageSize > 0
                BEGIN
                    SET @PageCount = @PageCount + 1
                END
            --获取当前页的数据
            SELECT TOP ( @PageSize )
                    *
            FROM    dbo.Orders
            WHERE   OrderID NOT IN ( SELECT TOP ( ( @PageIndex - 1 ) * @PageSize )
                                            OrderID
                                     FROM   dbo.Orders
                                     ORDER BY OrderID ASC )
            ORDER BY OrderID ASC
        END

    测试存储过程

    DECLARE @RecordCount INT ,
            @PageCount INT
    
    EXEC dbo.P_GetPagedOrders1
            @PageSize = 10, 
            @PageIndex = 1,
            @RecordCount = @RecordCount OUTPUT, 
            @PageCount = @PageCount OUTPUT
    
    SELECT  @RecordCount AS N'@RecordCount' ,
            @PageCount AS N'@PageCount'


    测试结果如下

  • 相关阅读:
    信息安全从业人员出路在哪里?
    内网渗透总结
    google hack使用集锦
    几十万学费总结出来的Ddos攻击防护经验!
    thinkPHP渗透之经验决定成败
    查找文件是否存在,文件属性、日期、大小;
    RS232/485通信方式 保存和加载时数据的处理
    memcpy(&pData[nDataLen],PROGDATA_FILE_FRAM,strlen(PROGDATA_FILE_FRAM)) ;
    #define BREAKIFTRUE( ret ) if( ( ret ) ) break;
    cp5200的一般步骤
  • 原文地址:https://www.cnblogs.com/jackylovewendy/p/4460405.html
Copyright © 2020-2023  润新知