2013-05-09 25 views
0

對於搜索類型的網頁,我有一個適度複雜的查詢(目前爲止超過1K LOC)。結果集需要按照一定的順序。有7種不同的標準用於訂購該套裝。我有兩個TABLE變量,一個叫@stageTable和@resultTable。我使用搜索參數運行動態查詢,並將結果放入@stageTable中。然後,我爲7個訂單條件中的每一個處理@stageTable,並將每個塊放入@resultTable中。這是按預期工作的。自定義排序(不使用ORDER BY)和分頁

我被要求爲這個怪物查詢添加分頁。我用ROW_NUMBER()路線去了CTE。但是,我意識到這不符合@resultTable中的順序。我遇到的問題是,ROW_NUMBER()OVER子句使用ORDER BY,它不允許我保留我在@resultTable中精心製作的訂單。我嘗試了不同的東西,包括在CTE中添加一個CASE塊。

該問題僅適用於用戶第一次加載頁面時以及何時滾動而不使用搜索頁面中的任何條件。

有關如何處理此問題的任何想法?

+0

選擇了默認的排序。 – 2013-05-09 18:51:03

回答

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) 
+1

@MikaelEriksson。 。 。非常感謝您的參考。這也有助於解釋爲什麼'inserts'是序列化的。 – 2013-05-09 19:00:41

+1

[在SQL Server中訂購保證...](http://blogs.msdn.com/b/sqltips/archive/2005/07/20/441053.aspx) – 2013-05-09 19:26:42

+0

這樣做了!這也是一個簡單的解決方案。 :) – 2013-05-10 20:22:03