从SQL Server端分页记录集

时间:2014-05-27 14:34:07

标签: .net sql-server vb.net

我一直在敲打这个。我想从一个SQL数据库中调用1k记录,然后每100个页面调用它们。在经典的ASP中(我从哪里移动)这对于ADODB很容易做到,但是使用ADO.net的VB我找不到单一的方法这不涉及存储过程(我现在想要避免)。调用所有1k并以编程方式对其进行排序似乎非常愚蠢。

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

编辑2: 重申一下,我广泛使用Google搜索并且不想使用存储过程。有很多方法可以获取分页数据,但我看到的一切都涉及在程序中而不是从服务器分页数据。

编辑3: 以下是使用Classic ASP进行服务器端分页的示例,它不需要任何服务器端。 (它使用Access,但对SQL来说是一样的) https://support.microsoft.com/kb/202125

1 个答案:

答案 0 :(得分:0)

ROW_NUMBER()就是你的答案。如果您的数据集包含支持deterministic结果的字段,则可以按如下方式绑定到所述字段:

构建测试数据集:

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')

确定性运行基于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子句调整为" Window"你的结果。

如果遇到无法确定性地生成结果的情况(例如nondeterministic),但您仍需要窗口事物,则可以使用以下技巧,我对此CONNECT文章赞不绝口:{{3 }}

-- 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

希望有所帮助,

约翰