0

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

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

该问题仅适用于用户第一次加载页面时,以及当他们在不使用搜索页面的任何条件的情况下滚动时。

关于如何处理这个问题的任何想法?

4

1 回答 1

3

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

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

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

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

标识列将根据​​输入的顺序进行设置。order bySQL Server 在使用带有插入的 an 时保证输入的顺序(或至少是它们的 id) (请参阅此处——感谢 Mikael Eriksson 提供此参考)。

当你输入你的 finalorder by时,你可以包括ResultTableId用于排序:

row_number() over (order by col1, ResultTableid)
于 2013-05-09T18:51:25.537 回答