2012-06-11 118 views
4

在SQL 2005/2008數據庫中,我們有表BatchMaster。列: RecordId bigint - autoincremental id,BatchNumber bigint - 唯一的非聚集索引,BatchDate)。我們有從本表返回分頁數據的sproc。該sproc適用於大多數客戶端,但在一個SQL服務器實例中,我們遇到了記錄順序問題。 一般情況下,在存儲過程我們做SQL ROW_NUMBER和排序問題

select * from 
(
    select row_number() over (order by bm.BatchDate desc, bm.BatchNumber desc) as Row, 
    * 
    from dbo.BatchMaster bm with (nolock) 
) 
where Row between @StartingRow and @EndgingRow 

所以,你可以從上面的腳本我們想返回由BatchDate和BatchNumber分類記錄通知。這不會發生在我們的客戶之一: enter image description here

記錄的順序是錯誤的。此外,請注意第一列(行),它不是按升序排列。

有人可以解釋爲什麼這樣嗎?

+5

您需要一種對你最外層查詢 – Limey

回答

6

您的代碼實際上沒有對結果進行排序,它只根據BatchDate和Batchnumber的順序設置'Row',並且似乎正確地執行了此操作。您需要將ORDER BY Row添加到您的語句中。

6

假設你想要的最低BatchNumber對於給定BatchDate具有最小號和要由訂貨,試試這個:

select * from 
(
    select row_number() over (order by bm.BatchDate desc, bm.BatchNumber asc) as Row, 
    * 
    from dbo.BatchMaster bm with (nolock) 
) 
where Row between @StartingRow and @EndgingRow 
order by Row 
2

更改您的查詢,包括在最外層查詢

排序
select * from 
(
    select row_number() over (order by bm.BatchDate desc, bm.BatchNumber desc) as Row, 
    * 
    from dbo.BatchMaster bm with (nolock) 
) 
where Row between @StartingRow and @EndgingRow 
order by Row 
2

ROW_NUMBER排名功能ORDER BY條款只適用於計算中的排名函數的值,它實際上並沒有下令次e結果。

如果你想在一個特定的順序,你需要指定你的查詢返回的記錄:ORDER BY [Row]