[SQL]為什麼Where 條件加個N,Select出來的資料順序跟沒加N的不同呢?

為什麼SQL的篩選條件的字串多加一個N,就會造成Select出來的資料順序跟沒加N的不同呢?

今天同事在詢問說為什麼SQL的篩選條件的字串多加一個N,就會造成Select出來的資料順序跟沒加N的不同呢? 如下,

image

 

看來是因為隱含轉換所以SQL選擇的執行計畫不同,所以就選擇了不同的Index,就造成結果的順序不同(該Where欄位為Char(10)),如下,

image

image

 

那要如何解決呢?

其實最好的是加在Order By中去明確要由那個欄位排序,就不會有這種問題! 不然,那裡會知道那天SQL會不會選另一個Index呢?

但是因為這個專案是說要跟舊系統的資料順序一樣(加上Index也跟舊的順序不同)!

所以......那就不要讓查詢條件加上N呀~~

但問題又來了,因為敝公司的底層元件在設定置換參數時,一設定Unicode就會自動加上N ~~

所以另一個解法是,再把它Convert成Char(10),如下,

AND HRM833.CMPCOD = N'A0XXX'

改成

AND HRM833.CMPCOD = CAST(N'A0XXX' AS CHAR(10))

資料的順序就跟舊系統產生出來的一致了!

原本以為這樣就OK了! 但是將結果Insert到Temp Table之中,又不對了~~

於是測試了一下,如果先建立Temp Table再 Insert Into … Select … ,資料順序就不對。

如果直接 Select …. Into …. 就OK。 但如果使用 Select … Into … 的方式,SQL 有些就要調整…….

後來測試,如果在建立Temp Table時,多加入 Identity 的欄位,順序就對了,如下,

image

 

所以下次如果有相似的問題,可以查一下執行計畫,或是在建立Temp Table時,多加入 Identity 的欄位哦!

當然,最好還是要什麼排序,還是要定義清楚,寫在Order By之中

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^