-4

这里的 SQL-noobie 想要将以下存储过程修改为从指定行开始选择指定行数的存储过程。比如我想从第10行开始选择5行,即10、11、12、13、14、15。

这是我的 SP 在 atm 的样子:

SELECT Posts.Slug, Comments.commentId, Comments.[date], Comments.name, Comments.[text]
FROM Comments 
INNER JOIN Posts ON Comments.postId = Posts.Id
WHERE Comments.approved = 0

我不需要对结果进行排序,因为我想按顺序阅读,以防万一。

谢谢!

4

4 回答 4

5

正如 Maurice 所说,在 SQL Server 2005/2008 中,您需要使用行号。不幸的是,LIMIT 语法不起作用。查询将如下所示(假设您要按日期订购)

WITH numbered AS
(
    SELECT 
       Posts.Slug, 
       Comments.commentId, 
       Comments.[date],
       Comments.name, Comments.[text],  
       ROW_NUMBER() OVER (ORDER BY date) as rownum
    FROM Comments 
    INNER JOIN Posts ON Comments.postId = Posts.Id
    WHERE Comments.approved = 0
) 
SELECT * FROM numbered WHERE rownum BETWEEN @startrow AND @endrow

以上假设@startrow 和@endrow 是传递给您的存储过程的参数。

于 2013-07-29T19:26:47.273 回答
4

如果您碰巧使用的是 SQL Server 2012,则可以使用OFFSETandFETCH进行分页,但它们需要一个ORDER BY子句:

SELECT Posts.Slug, Comments.commentId, Comments.[date], Comments.name, Comments.[text]
FROM Comments 
INNER JOIN Posts ON Comments.postId = Posts.Id
WHERE Comments.approved = 0
ORDER BY [date]
OFFSET 10 ROWS
FETCH NEXT 5 ROWS ONLY

如果不使用 SQL Server 2012,那么ROW_NUMBER()方法就是您应该采用的方法。

如果您确实想要任意排序,则可以使用ORDER BY (SELECT 1),但如果没有明确的排序,则无法保证一致性。

于 2013-07-29T19:33:18.327 回答
-2

确实最快的 sql server 是

SELECT col1, col2 
FROM (
    SELECT col1, col2, ROW_NUMBER() OVER (ORDER BY ID) AS RowNum
    FROM MyTable
) AS MyDerivedTable
WHERE MyDerivedTable.RowNum BETWEEN @startRow AND @endRow

看看这里

于 2013-07-29T19:29:37.550 回答
-3

在 t-sql 中使用 ROW_NUMBER() 函数。见MSDN

USE AdventureWorks2012;
GO
WITH OrderedOrders AS
(
    SELECT SalesOrderID, OrderDate,
    ROW_NUMBER() OVER (ORDER BY OrderDate) AS RowNumber
    FROM Sales.SalesOrderHeader 
) 
SELECT SalesOrderID, OrderDate, RowNumber  
FROM OrderedOrders 
WHERE RowNumber BETWEEN 50 AND 60;
于 2013-07-29T19:30:34.227 回答