2013-07-30 88 views
0

我正在轉換爲C#的舊VB6.0應用程序。在應用程序中查詢了許多SQL Server視圖。我在VB6.0和C#中傳遞相同的SELECT語句來查詢視圖。我還提供了每種語言中完全相同的WHERE子句,並且沒有ORDER BY子句。視圖確實包含自己的ORDER BY子句。以不同順序返回的SQL結果集爲VB6與C#

在VB6.0中,結果集始終以相同的順序返回,在C#中,結果集始終以相同的順序返回。但是,返回到VB6.0和C#的訂單不匹配。我可以通過VB6.0查詢,然後在幾秒鐘後通過C#查詢,結果集的順序不同。

什麼可能導致結果集訂單不同?我需要將從新C#代碼生成的一些輸出文件與VB6.0代碼進行比較以進行驗證,所以我想要讓結果集以相同順序返回,或者至少了解爲什麼結果集訂單在VB6.0和C#之間不匹配,但在從同一種語言調用時總是匹配。

+0

提示:按視圖排序可能無法按預期工作:http://stackoverflow.com/questions/15187676/create-a-view-with-order-by-clause –

+0

由於您正在重寫應用程序,因此您可以從使用ORM中受益。 –

回答

12

如果沒有指定ORDER BY從未保證什麼樣的順序記錄都回。

順序可能通常回來涉及到一個聚集索引的順序或數據/模式的其他特徵。但它可以在沒有任何警告的情況下改變,也可以改變,你可以理解。
- 這可能是由於其核心是或不是忙着
- 這可能是由於您使用的SQL Server使用的接口
- 這可能是因爲這是最近推出的
記錄 - 或者碎片
- 或表緩存/結果
- 或SQL Server或操作系統上的補丁


如果訂單事宜,最終/曲最外層指定ORDER BY ery

+0

底層視圖指定了ORDER BY,可能無法按預期工作。 –

+1

@DR底層視圖上的ORDER BY被SQL Server優化了。它知道當你將ORDER BY與TOP結合起來時,ORDER BY用於確定要包含哪些行,而不是以何種順序呈現它們。當你將它與TOP 100 PERCENT(幾乎在每一個視圖中都存在)相結合時,SQL Server會說:「哦,你得到了所有的行,所以我不需要使用ORDER BY來過濾。我會找到自己的方式來過濾。「它拋棄了TOP和ORDER BY。檢查使用ORDER BY引用視圖的計劃,當外部查詢沒有時 - 您不會找到排序/頂級運算符。 –