我有一个像(OrderID [uniqueidentifier],OrderDesciption [nvarchar])的表结构,我正在使用ADO.Net + C#+ VSTS 2008 + SQL Server 2008.表很大,我想让客户给我两个输入,开始范围索引和结束范围索引,我将返回该范围内的特定行(在开始范围索引和结束范围索引之间)。
例如,如果客户端输入50,100,我想要返回第50行直到第100行。
提前谢谢, 乔治答案 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