从SQL服务器端分页记录集



这个问题我已经纠结了好一阵子了。我想从SQL数据库调用1k条记录,每100页。在经典的ASP(我从哪里移动),这是非常容易做到与ADODB,但与VB使用ADO.net,我找不到一个单一的方式,不涉及存储过程(这是我想要避免的)。调用所有1k并以编程方式排序似乎真的很愚蠢。

编辑:SQL Server 2005/.net 4.0/Visual Studio 2010

编辑2:重申一下,我已经广泛地搜索过了,不想使用存储过程。有许多方法可以获得分页数据,但我看到的所有方法都涉及到在程序中分页数据,而不是从服务器中分页数据。

编辑3:下面是一个使用经典ASP的服务器端分页示例,它不需要任何服务器端内容。(它使用Access,但它是相同的SQL)https://support.microsoft.com/kb/202125

ROW_NUMBER()是您的答案。如果您的数据集具有支持确定性结果的字段,则可以按照以下方式绑定这些字段:

构建测试数据集:

DECLARE @RecordSet TABLE
(
    ID  INT IDENTITY(1,1),
    VALUE   VARCHAR(255)
)
INSERT INTO @RecordSet (VALUE) VALUES ('One')
INSERT INTO @RecordSet (VALUE) VALUES ('Two')
INSERT INTO @RecordSet (VALUE) VALUES ('Three')
INSERT INTO @RecordSet (VALUE) VALUES ('Four')
INSERT INTO @RecordSet (VALUE) VALUES ('Five')
INSERT INTO @RecordSet (VALUE) VALUES ('Six')
INSERT INTO @RecordSet (VALUE) VALUES ('Seven')
INSERT INTO @RecordSet (VALUE) VALUES ('Eight')
INSERT INTO @RecordSet (VALUE) VALUES ('Nine')
INSERT INTO @RecordSet (VALUE) VALUES ('Ten')

Deterministic运行基于ID或VALUE字段:

-- Deterministic - Ordering Numerically by PKey
SELECT ID, VALUE, RowNum
FROM
(
    SELECT ID, VALUE, ROW_NUMBER() OVER (PARTITION BY 0 ORDER BY ID) AS RowNum
    FROM @RecordSet
    WHERE VALUE LIKE '%e%'
) t
WHERE  t.RowNum BETWEEN 3 AND 6
-- Deterministic - Ordering Alphanumerically by Value
SELECT ID, VALUE, RowNum
FROM
(
    SELECT ID, VALUE, ROW_NUMBER() OVER (PARTITION BY 0 ORDER BY VALUE) AS RowNum
    FROM @RecordSet
    WHERE VALUE LIKE '%e%'
) t
WHERE  t.RowNum BETWEEN 3 AND 6

正如你所看到的,你可以根据RowNum字段调整WHERE子句来"窗口"你的结果。

如果您遇到无法确定地生成结果的情况(例如,非确定性),但您仍然需要窗口的东西,您可以使用以下技巧,我将其归功于这篇CONNECT文章:http://connect.microsoft.com/SQLServer/feedback/details/383888/fully-support-position-in-xquery

-- Nondeterministic Ordering -- Probably want to avoid as these results are not guaranteed to be repeatable
SELECT ID, VALUE, RowNum
FROM
(
    SELECT ID, VALUE, ROW_NUMBER() OVER (PARTITION BY 0 ORDER BY NULLIF(0*RAND(), 0)) AS RowNum
    FROM @RecordSet
    WHERE VALUE LIKE '%e%'
) t
WHERE  t.RowNum BETWEEN 3 AND 6

希望有帮助,

约翰

最新更新