2013-01-23 25 views
3

我注意到,當寫插入到表變量中的sproc值與插入順序不同時。有沒有辦法禁用此自動排序而不添加另一列進行排序?想到的想法是創建自動索引或一些整理設置......任何想法?爲什麼sql server會自動排序表變量的行?

訪問http://sqlfiddle.com/#!3/e1c06/13看正是我的意思

declare @tmpTbl table (name varchar(100)) 
insert into @tmpTbl 
select 'mark' 
union 
select 'frank' 
union 
select 'sharon' 
union 
select 'jason' 

select * from @tmpTbl 
+3

代碼依賴於表中數據存儲的任意順序從來沒有好的理由。 – mellamokb

+0

我同意,當測試腳本的輸出時,我發現它很奇怪。如果我需要它,我會使用ORDER BY – markS

+0

「關係模型指定關係的元組沒有特定的順序,元組轉而對屬性強加任何命令。「 - [關係數據庫](http://en.wikipedia.org/wiki/Relational_database) –

回答

3

如果您希望按插入順序對它們進行排序,請爲您的表添加自動遞增字段,然後在選擇數據時將其包含在ORDER BY中。

SQL Server否則不會以特定順序返回您的數據 - 它似乎現在正在返回「排序」,但未來可能不會如此。

順便說一句 - 聯合查詢本身實際上是以不同於它們在語句中出現的順序返回結果。這可能是使用UNION和UNION ALL的結果,因爲union是不同的,它可能意味着某種類型。所以,你實際得到的結果是插入順序。

+2

對於'UNION'和'UNION ALL' +1以及影響排序順序的(可能的)底層實現。 –

+0

哈哈蒂姆有道理...聯盟抓住所有的行來刪除dups,所以prob在插入表之前對它進行一些排序,但Union All不關心dups ...我會接受這個作爲答案如果它不是評論:-p謝謝你! – markS

+0

嗯,這不是一個真正的評論 - 但無論如何:) –

5

簡短的答案是(可能)「,因爲存儲引擎存儲你的行中的無序堆積,並且影響的行怎麼出來的時候你不要指定ORDER BY「。

除非您在SELECT查詢中提供了ORDER BY,否則按照SQL規範,排序順序爲undefined。這就是它在每個SQL數據庫中的方式,無論是MySql,Oracle還是SQL Server。如果數據按照您期望的順序從表中出來,那麼巧合,或者很可能是優化程序碰巧生成查詢的副作用,或者存儲引擎選擇如何物理存儲行(可能很可能在這種情況下的根本原因)。

如果按照所需的排序順序將聚集索引添加到表中,但是很多次(但並非總是),表格會按照您期望的順序出現。 千萬不要依賴這種行爲。

+0

聽起來像一個合法的想法,但我測試了它超過50次,每次它的順序,這讓我覺得它的自動排序而不是每次隨機出來 – markS

+3

我沒有說排序順序是** random **,我說它是** undefined **。有一個世界的不同。如果您重複輸入相同的數據,存儲引擎或優化器將優化您的查詢並以相同的方式插入。這並不意味着它將永遠是這樣。服務包或SQL升級或配置更改可能會導致訂單更改。 **如果您關心結果排序**,請始終使用ORDER BY。沒有例外。 –