检索SQL Server表中的特定行范围

时间:2009-06-21 12:58:32

标签: c# .net sql-server-2008 ado.net

我有一个像(OrderID [uniqueidentifier],OrderDesciption [nvarchar])的表结构,我正在使用ADO.Net + C#+ VSTS 2008 + SQL Server 2008.表很大,我想让客户给我两个输入,开始范围索引和结束范围索引,我将返回该范围内的特定行(在开始范围索引和结束范围索引之间)。

例如,如果客户端输入50,100,我想要返回第50行直到第100行。

提前谢谢, 乔治

4 个答案:

答案 0 :(得分:15)

您可以在SQL(2005年起)中使用ROW_NUMBER来执行此操作:

SELECT  ID, Foo, Bar
FROM     (SELECT  ROW_NUMBER() OVER (ORDER BY ID ASC) AS Row,
          ID, Foo, Bar
FROM    SomeTable) tmp
WHERE   Row >= 50 AND Row <= 100

或者使用LINQ-to-SQL等:

var qry = ctx.Table.Skip(50).Take(50); // or similar

答案 1 :(得分:4)

基本上,你在SQL Server 2005和2008中最好的选择是一个CTE - 公用表表达式 - 里面有一个ROW_NUMBER()函数 - 就像这样:

WITH MyOrders AS
(
  SELECT
    OrderID,
    OrderDescription,
    ROW_NUMBER() OVER (ORDER BY OrderID) as 'RowNum'
  FROM YourOrders
)
SELECT * FROM MyOrders
WHERE RowNum BETWEEN 50 AND 100

但是这需要一个有用且合适的ORDER BY子句,并且按GUID排序实际上并不是一个好主意。 DATETIME或不断增加的ID最好。

马克

答案 2 :(得分:2)

试试这个,结果将按 OrderID 列排序。使用您的表格更改 MyTable

SELECT * 
FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY OrderID) AS row FROM MyTable) a 
WHERE row > 50 AND row <= 100

所选行的行数从 50 100 ,但请注意结果中不包含第50行。

答案 3 :(得分:1)

SELECT * FROM(SELECT *,ROW_NUMBER()OVER(ORDER BY OrderId)作为行FROM Orders)一个WHERE行&gt; 5和行&lt; = 10