分页SQL Server 2005结果

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

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

我的意思是分页,例如,如果我通过他们的用户名列出用户,我希望能够只返回前10条logging,然后是下10条logging等等。

任何帮助将不胜感激。

您可以使用the Row_Number()函数。 它的用法如下:

 SELECT Row_Number() OVER(ORDER BY UserName) As RowID, UserFirstName, UserLastName FROM Users 

从中可以得到带有RowID字段的结果集,您可以使用该字段在页面之间进行分页。

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

等等

如果你想在一个语句(总数加分页)中得到它。 您可能需要了解SQL Server支持分区依据子句(ANSI SQL术语中的窗口函数)。 在Oracle中,语法与上面使用row_number()的示例类似,但是我还添加了一个分区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 

请注意,我有哪里所有者=“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 

接受的答案实际上并不适用于我…我不得不跳过一个环来让它工作。

当我试着回答

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

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

我不得不把它包装在这样的内部select:

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

然后它工作。

当我需要分页时,我通常也使用临时表。 您可以使用输出参数来返回logging的总数。 select中的case语句允许您对特定列上的数据进行sorting,而不需要求助于dynamicSQL。

 --Declaration-- --Variables @StartIndex INT, @PageSize INT, @SortColumn VARCHAR(50), @SortDirection CHAR(3), @Results INT OUTPUT --Statements-- SELECT @Results = COUNT(ID) FROM Customers WHERE FirstName LIKE '%a%' SET @StartIndex = @StartIndex - 1 --Either do this here or in code, but be consistent CREATE TABLE #Page(ROW INT IDENTITY(1,1) NOT NULL, id INT, sorting_1 SQL_VARIANT, sorting_2 SQL_VARIANT) INSERT INTO #Page(ID, sorting_1, sorting_2) SELECT TOP (@StartIndex + @PageSize) ID, CASE WHEN @SortColumn='FirstName' AND @SortDirection='ASC' THEN CAST(FirstName AS SQL_VARIANT) WHEN @SortColumn='LastName' AND @SortDirection='ASC' THEN CAST(LastName AS SQL_VARIANT) ELSE NULL END AS sort_1, CASE WHEN @SortColumn='FirstName' AND @SortDirection='DES' THEN CAST(FirstName AS SQL_VARIANT) WHEN @SortColumn='LastName' AND @SortDirection='DES' THEN CAST(LastName AS SQL_VARIANT) ELSE NULL END AS sort_2 FROM ( SELECT CustomerId AS ID, FirstName, LastName FROM Customers WHERE FirstName LIKE '%a%' ) C ORDER BY sort_1 ASC, sort_2 DESC, ID ASC; SELECT ID, Customers.FirstName, Customers.LastName FROM #Page INNER JOIN Customers ON ID = Customers.CustomerId WHERE ROW > @StartIndex AND ROW <= (@StartIndex + @PageSize) ORDER BY ROW ASC DROP TABLE #Page 

我相信你需要执行一个单独的查询,以实现这个不幸的。

我可以使用本页的一些帮助,在我以前的位置上完成此任务: 在DotNet 2.0中进行分页

他们也分别计算了一下。

以下是我为分页所做的工作:所有需要分页的大查询都被编码为插入临时表。 临时表有一个标识字段,其行为与上面提到的row_number()类似。 我将临时表中的行数存储在输出参数中,以便调用代码知道有多less个总logging。 调用代码还指定要从哪个页面中select哪个页面,以及每个页面有多less行,这些行从temp表中选出。

这样做很酷的事情是,我也有一个“导出”链接,允许您从我的应用程序中的每个网格上面获取以CSV格式返回的报表中的所有行。 这个链接使用相同的存储过程:只是返回临时表的内容,而不是执行分页逻辑。 这安抚了讨厌分页的用户,希望看到所有内容 ,并希望以一百多种不同的方式进行分类。