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 服务器。
所以问题:
- 我如何获得提供的方法来读取下一个 '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
我有以下代码:
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 服务器。
所以问题:
- 我如何获得提供的方法来读取下一个 '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