T-SQL Skip Take Stored Procedure T-SQL Skip Take Stored Procedure sql sql

T-SQL Skip Take Stored Procedure


For 2005 / 2008 / 2008 R2

;WITH cte AS(    SELECT  Journals.JournalId,             Journals.Year,             Journals.Title,             ArticleCategories.ItemText,            ROW_NUMBER() OVER                      (ORDER BY Journals.JournalId,ArticleCategories.ItemText) AS RN    FROM    Journals LEFT OUTER JOIN            ArticleCategories              ON Journals.ArticleCategoryId = ArticleCategories.ArticleCategoryId)    SELECT  JournalId,             Year,             Title,             ItemTextFROM cteWHERE RN BETWEEN 11 AND 20

For 2012 this is simpler

SELECT Journals.JournalId,       Journals.Year,       Journals.Title,       ArticleCategories.ItemTextFROM   Journals       LEFT OUTER JOIN ArticleCategories         ON Journals.ArticleCategoryId = ArticleCategories.ArticleCategoryIdORDER  BY Journals.JournalId,          ArticleCategories.ItemText OFFSET  10 ROWS FETCH NEXT 10 ROWS ONLY 


In addition to @Martin Smith's correct answer - when using a GROUP BY, you can't use OFFSET-FETCH without an ORDER BY:

GROUP BY [cols]ORDER BY [col] ASC|DESCOFFSET  10 ROWS FETCH NEXT 10 ROWS ONLY 

The following gives "incorrect syntaxt near 'OFFSET'" :

GROUP BY [cols]--ORDER BY [col] ASC|DESCOFFSET  10 ROWS FETCH NEXT 10 ROWS ONLY