帮酷LOGO
0 0 评论
  • 显示原文与译文双语对照的内容
文章标签:Sql Server 2005  Paging  Server  ms-sql-server  

介绍

如果你不使用 DataGrid 和它的他所有制作的用户控件,则必须解决如何通过数据库服务器创建分页查询。 流行的web数据库服务器( 如MySQL或者 firebird ) 使用专有语法,比如" 限制 20,10 或者或"或者" 第一个 5跳 2 等"等。

必须识别结果中的记录数,然后计算分页查询所需的页数和所有项。 这意味着两次到数据库,当表大,扩展,巨大和缓慢时,这不是很方便。 在 sql Server 2005公共表表达式( CTE ) 中,可以在一次访问数据库服务器时进行分页查询。

本文介绍了如何仅使用sql和 C# 实现这一工作。

例如:你对AdventureWorks数据库有一个简单的SQL查询,如下所示:

SELECT ProductID, [Name], ProductNumber, MakeFlag, FinishedGoodsFlag, 
 Color, SafetyStockLevelFROM Production.Product WHERE ProductNumber like'BK%'ORDERBY [Name] DESC

有必要提取出" Order By clause子句并裁剪第一个单词("选择")。 订单字段是必需的 ! 函数 Row_Number 在没有顺序字段的情况下不起作用。 如果你没有任何可以用的字段,建议在 Order By 子句。这里查询稍稍长一些,但你可以在应用程序代码中替换我声明的sql变量。 原始查询可见。

declare@explicitMaximumintdeclare@chosenPageintdeclare@recordsPerPageintset@explicitMaximum = 100set@chosenPage = 2set @recordsPerPage=10;WITH X AS (SELECTTOP(@explicitMaximum)
ROW_NUMBER() OVER (ORDERBY [Name] DESC) AS RowNumber, -- extracted order -- clauseCASEWHEN COUNT(*) OVER(PARTITIONBY'')> @explicitMaximum THEN 
 @explicitMaximumELSE COUNT(*) OVER(PARTITIONBY'') ENDas totalCount,------------ Original queryProductID, [Name], ProductNumber, MakeFlag, FinishedGoodsFlag, Color, 
 SafetyStockLevelFROM Production.Product WHERE ProductNumber like'BK%'ORDERBY [Name] DESC------------) SELECT 
(totalCount-1)/@recordsPerPage+1 as actualPageCount, *FROM x WHERE (RowNumber-1)/@recordsPerPage+1 = CASEWHEN (
 totalCount-1)/@recordsPerPage+1<@chosenPage THEN (
 totalCount-1)/@recordsPerPage+1 ELSE@chosenPageEND

你必须接收三个新的冗余字段 {actualPageCount, RowNumber, totalCount} 但只有 RowNumber 才真正无用。 当你想在你的网站上使用这个结果时,所有。 如果分页结果只有 20 -50记录,那么你可以使用任何奇怪的NAME 来使用这些字段。 这里组合可以抵抗以下事件: @explicitMaximum 小于 计数( * ) 在查询中,或者@chosenPage 高于 actualPageCount,但必须在web应用程序中处理该事件,并且最近所选的页面必须受影响。

从查询中提取订单字段的C# 代码位于本文所附的项目中。 Order子句只能在查询中一次,并且只能在外部选择( 不在省略号内) 中。 可以按空格拆分SQL查询,然后使用这里 array 查找订单子句。



文章标签:Server  Paging  Sql Server 2005  ms-sql-server  

Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语