T-SQL 跳过存储过程

Posted

技术标签:

【中文标题】T-SQL 跳过存储过程【英文标题】:T-SQL Skip Take Stored Procedure 【发布时间】:2011-08-03 00:11:14 【问题描述】:

我似乎在这个网站上运气不佳,仍然永远是乐观主义者,我会继续努力。 我有两个表,Journals 和 ArticleCategories 使用此查询连接:

SELECT Journals.JournalId,
       Journals.Year,
       Journals.Title,
       ArticleCategories.ItemText
FROM   Journals
       LEFT OUTER JOIN ArticleCategories
         ON Journals.ArticleCategoryId = ArticleCategories.ArticleCategoryId 

谁能告诉我如何将它重新编写成一个 Skip, Take 查询。 换句话说,我希望它跳过前 n 条记录,然后取下 n 条记录。 我认为 ROW_NUMBER 涉及到某处,但我不知道在这种情况下如何使用它。

我怀疑运气不好的原因是我很难解释我想要做什么。 如果我的问题不清楚,请随时告诉我哪里出错了,我很乐意再试一次。 也许我还应该提到我正在尝试将其放入存储过程中。 非常感谢。 非常感谢,

【问题讨论】:

first n records - 按什么顺序排列? 好点!我忘了提到它需要由某些东西订购。我能否再次强加给您并询问如何包含 ORDER BY Journals.Year?非常感谢马丁。 对不起我之前的评论马丁。如果我再小心一点,我会注意到你已经包含了一个 ORDER BY 语句。再次感谢您。 【参考方案1】:

对于 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, 
            ItemText
FROM cte
WHERE RN BETWEEN 11 AND 20

对于 2012 年,这更简单

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

【讨论】:

优秀!谢谢马丁,效果很好。非常感谢。【参考方案2】:

除了@Martin Smith 的正确答案——当使用GROUP BY 时,你不能在没有ORDER BY 的情况下使用OFFSET-FETCH

GROUP BY [cols]

ORDER BY [col] ASC|DESC

OFFSET  10 ROWS 
FETCH NEXT 10 ROWS ONLY 

以下给出“'OFFSET'附近的语法错误”:

GROUP BY [cols]

--ORDER BY [col] ASC|DESC

OFFSET  10 ROWS 
FETCH NEXT 10 ROWS ONLY 

【讨论】:

以上是关于T-SQL 跳过存储过程的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL存储过程

T-SQL存储过程

SQL server T-SQL存储过程

如何使用来自 c# 的 MySQL 存储过程将表作为输入发送到存储过程?我有 T-SQL 工作

SQL Server——存储过程

如何从 T-SQL 存储过程返回表