sql select 前 X 到 X+N

sql select top X to X+N

我有以下代码:

private ArrayList LoadContentObjects()
        {
            ArrayList tmp = new ArrayList();
            SqlCommand command = null;
            command = new SqlCommand("SELECT TOP 150 ObjectUrl FROM [ContenbtObjectsUnprocessed]");
            command.CommandType = System.Data.CommandType.Text;
            command.Connection = conn;
            SqlDataReader reader = command.ExecuteReader();

            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    var res = reader.GetString(0);
                    tmp.Add(res);
                }
            }

            reader.Close();

            return tmp;
        }

从 table ContentObjectsUnprocessed

中读取 150 行

(must fix the spelling mistake in the table!) It then check is there are rows; if there is it adds them to a tmp ArrayList and returns that to the caller.

当我第二次调用这个方法时。我希望它加载接下来的 150 行。但是,我无法做到这一点。此Sql连接到 Azure Sql 服务器。

所以问题:

  1. 我如何获得提供的方法来读取下一个 'N' 行 数据库?
select a.ObjectUrl 
from
  (
    SELECT ObjectUrl,ROW_NUMBER() OVER (order by ObjectDateMaybe) rn 
    FROM [ContenbtObjectsUnprocessed]
  ) a
where a.rn<=300 and a.rn>=150

您可以在不同的临时 table 中缓存 150 行的块以获得更好的性能。

读取更快,删除更慢:

    SELECT ObjectUrl 
    FROM [ContenbtObjectsUnprocessed]
    where predefined150smultiples=2

其中 predefined150smultiples 是一个包含 1,1,1,1,...2,2,2,2 的列,每组 150 行。删除需要更新许多行,所以这可能不是那么好。正如 hvd 评论的那样,任何更改顺序的更新都会使该专栏过时,并且需要对整个 table 进行全新更新,这也不好。

如果您正在使用 SQL-Server 2012 那么它将对您有所帮助。使用 LIMIT

SELECT a.ObjectUrl FROM [ContenbtObjectsUnprocessed] a LIMIT 151,300

如果您使用的是 Sql Server 2012+ 或 (Azure) Sql 数据库,您可以使用 ORDER BY 子句的 OFFSET-FETCH 参数。示例:

SELECT [Id]
      ,[Name]
      ,[Location]
  FROM [dbo].[Company]
  ORDER BY Name
  OFFSET 50 ROWS FETCH NEXT 10 ROWS ONLY

参考:http://msdn.microsoft.com/en-us/library/ms188385.aspx