自定义排序(不使用ORDER BY)和分页

时间:2013-05-09 18:44:31

标签: sql tsql pagination dynamic-sql

对于搜索类型的网页,我有一个中等复杂的查询(到目前为止超过1K LOC)。结果集需要按特定顺序排列。有7个不同的标准用于订购此套装。我有两个TABLE变量,一个叫@stageTable和@resultTable。我使用搜索参数运行动态查询,并将结果放入@stageTable。然后,我为7个订单标准中的每一个处理@stageTable,并将每个块放在@resultTable中。这是按预期工作的。

我被要求为这个怪物查询添加分页。我用ROW_NUMBER()路线去了CTE。但是,我意识到这不符合@resultTable中的顺序。我遇到的问题是ROW_NUMBER()OVER子句使用ORDER BY,这不允许我保留我在@resultTable中精心设计的顺序。我尝试了不同的东西,包括在CTE中添加一个CASE块。

此问题仅适用于用户首次加载页面以及在不使用搜索页面中的任何条件的情况下滚动页面时。

有关如何处理此事的任何想法?

1 个答案:

答案 0 :(得分:3)

定义@ResultTable时,添加标识列:

declare @ResultTable table (
     ResultTableId int not null identity(1, 1),
     . . .
);

当您插入表格时,将所有其他列放在列列表中:

insert into @ResultTable (col1, . .. )
    select . . .

将根据输入顺序设置标识列。当使用带有插入的order by时,SQL Server保证输入(或至少是它们的ID)的排序(请参阅here - 感谢Mikael Eriksson提供此参考)。

当您输入最终order by时,可以在ResultTableId中加入订购:

row_number() over (order by col1, ResultTableid)