SQL Server使用循环前进X行

SQL Server使用循环前进X行,sql,sql-server,sql-server-2008,cursor,offset,Sql,Sql Server,Sql Server 2008,Cursor,Offset,假设我有一个名为Class的表,其中包含以下列 ClassID INT ClassName VARCHAR(100) SortOrder INT 假设此表中有10行(10个类)。现在假设我知道我当前的类ID,我需要“前进”X个类(基于它们的排序顺序)并获取新类的记录/行。我需要它来处理“循环”,这意味着如果当前的类排序顺序是7并且X=5,那么新的类id将是2(当它达到10时,它将循环到1并继续计数) 到目前为止,我有: DECLARE @OffsetClasses INT = 5 -- Thi

假设我有一个名为
Class
的表,其中包含以下列

ClassID INT
ClassName VARCHAR(100)
SortOrder INT
假设此表中有10行(10个类)。现在假设我知道我当前的类ID,我需要“前进”X个类(基于它们的排序顺序)并获取新类的记录/行。我需要它来处理“循环”,这意味着如果当前的类排序顺序是7并且X=5,那么新的类id将是2(当它达到10时,它将循环到1并继续计数)

到目前为止,我有:

DECLARE @OffsetClasses INT = 5 -- This gets populated (not hard coded, but that is not relevant to the issue)

DECLARE @NewClassID INT = (SELECT TOP 1 ClassID
                           FROM Classes
                           ORDER BY SortOrder
                           OFFSET @OffsetClasses ROWS);
。。。但这并不是循环的,
OFFSET
语法似乎不能与
ORDER BY
一起工作,而且
OFFSET
似乎不支持行数的变量

在SQLServer2008中,最简单和最快的方法是什么?我是否必须使用光标(我不喜欢)?

您可以使用运算符来完成此操作。你知道这三个价值观:

DECLARE @OffsetClasses INT = 5
DECLARE @CurrentID INT = 7
DECLARE @ClassesCount INT = 10
那么获取当前排序顺序就很简单了:

DECLARE @CurrentSortOrder INT
select @CurrentSortOrder = SortOrder from Classes where ClassID = @CurrentID
假设您的排序顺序是从1到10的提升序列,没有间隙,则可以按如下方式检索下一行:

select * from Classes 
where SortOrder = (@CurrentSortOrder + @OffsetClasses - 1) % @ClassesCount + 1