分页SQL Server 2005结果

Gat*_*ler 39 sql paging sql-server-2005

如何在SQL Server 2005中分页结果?

我在SQL Server 2000中尝试过,但没有可靠的方法来做到这一点.我现在想知道SQL Server 2005是否有任何内置方法?

我的意思是,例如,如果我按用户名列出用户,我希望能够只返回前10个记录,然后是接下来的10个记录,依此类推.

任何帮助将非常感激.

Pat*_*Pat 35

你可以使用the Row_Number()功能.其用途如下:

SELECT Row_Number() OVER(ORDER BY UserName) As RowID, UserFirstName, UserLastName
FROM Users
Run Code Online (Sandbox Code Playgroud)

从中可以生成一个结果集,RowID其中包含可用于在页面之间进行分页的字段.

SELECT * 
FROM 
    ( SELECT Row_Number() OVER(ORDER BY UserName) As RowID, UserFirstName, UserLastName
      FROM Users 
    ) As RowResults
WHERE RowID Between 5 AND 10
Run Code Online (Sandbox Code Playgroud)

等等

  • 在内部选择中,您可以选择TOP X行(X =想要的最大行,在本例中为10).它将提高查询的速度. (2认同)

Bri*_*ian 13

如果你试图在一个语句(总和加上分页)中得到它.您可能需要探索SQL Server对partition by子句的支持(使用ANSI SQL术语中的窗口函数).在Oracle中,语法就像上面使用row_number()的示例一样,但是我还添加了一个partition by子句来获取分页中返回的每一行所包含的总行数(总行数为1,262):

SELECT rn, total_rows, x.OWNER, x.object_name, x.object_type
FROM (SELECT COUNT (*) OVER (PARTITION BY owner) AS TOTAL_ROWS,
         ROW_NUMBER () OVER (ORDER BY 1) AS rn, uo.*
         FROM all_objects uo
         WHERE owner = 'CSEIS') x
WHERE rn BETWEEN 6 AND 10
Run Code Online (Sandbox Code Playgroud)

请注意,我有所有者='CSEIS',我的分区是所有者.结果如下:

RN  TOTAL_ROWS  OWNER   OBJECT_NAME            OBJECT_TYPE
6   1262    CSEIS   CG$BDS_MODIFICATION_TYPES   TRIGGER
7   1262    CSEIS   CG$AUS_MODIFICATION_TYPES   TRIGGER
8   1262    CSEIS   CG$BDR_MODIFICATION_TYPES   TRIGGER
9   1262    CSEIS   CG$ADS_MODIFICATION_TYPES   TRIGGER
10  1262    CSEIS   CG$BIS_LANGUAGES            TRIGGER
Run Code Online (Sandbox Code Playgroud)

  • +1很好 - 让它在使用COUNT(*)OVER(PARTITION BY NULL)的sqlserver上工作 (2认同)

Bes*_*ska 5

对此我接受的答案实际上并不适用于我......我不得不再跳过一个箍来让它发挥作用.

当我尝试答案时

SELECT Row_Number() OVER(ORDER BY UserName) As RowID, UserFirstName, UserLastName
FROM Users
WHERE RowID Between 0 AND 9
Run Code Online (Sandbox Code Playgroud)

它失败了,抱怨说它不知道RowID是什么.

我必须将它包装在内部选择中,如下所示:

SELECT * 
FROM
    (SELECT
    Row_Number() OVER(ORDER BY UserName) As RowID, UserFirstName, UserLastName
    FROM Users
    ) innerSelect
WHERE RowID Between 0 AND 9
Run Code Online (Sandbox Code Playgroud)

然后它奏效了.