2010-07-09 84 views
2

在SQL Server 2008中,我在訂購NVARCHAR列時看到一些奇怪的行爲;這裏有幾個簡單的用例來證明:SQL Server 2008 - VARCHAR與NVARCHAR值上的不同排序順序

案例一:訂單在VARCHAR值:

SELECT t.Name 
FROM 
( 
SELECT CAST('A' AS VARCHAR(500)) As Name 
UNION SELECT CAST('-A' AS VARCHAR(500)) AS NAME 
) As t 
ORDER BY t.Name ASC 

其產生(我需要)輸出:

-A
一個

(首先顯示帶破折號的那個)

將此與NVARCHAR值上的ORDER對照:

SELECT t.Name 
FROM 
( 
SELECT CAST('A' AS NVARCHAR(500)) As Name 
UNION SELECT CAST('-A' AS NVARCHAR(500)) AS NAME 
) As t 
ORDER BY t.Name ASC 

其中產生這樣的輸出:

一個
-A

假設我要作爲排序依據NVARCHAR字段(我不能改變數據庫設計),採用標準的ORDER BY子句(我正在使用linq2nhib,它阻止了我在這裏進行任何投射) - 如何讓排序以所需的方式工作(首先顯示帶有非字母數字值的項目)?

我希望有某種數據庫/服務器級別的排序規則設置...任何想法?

+3

這裏描述了行爲的原因。 http://support.microsoft.com/kb/322112我不確定是否有方法。將使用二進制排序規則爲您工作? http://social.msdn.microsoft.com/Forums/en/transactsql/thread/a2785ed0-2355-43f3-bd8b-2200824e9c1f – 2010-07-09 14:50:36

+0

感謝您的評論,這正是描述我所看到的行爲......現在我只是需要解決方案!我不介意更改數據庫的排序規則設置,是否有一個會產生我想要的結果(並仍然允許使用unicode列等)? – DanP 2010-07-09 14:53:33

+0

你可以使用'ORDER BY t.Name COLLATE Latin1_General_Bin ASC',但是這會分離出小寫和大寫的名字。這裏再討論一些http://blogs.msdn.com/b/sqlprogrammability/archive/2006/04/07/570397。aspx – 2010-07-09 15:02:54

回答

1

要麼更改數據庫中的排序規則,要麼更改表中各個列的排序規則,以便您需要一致的排序。

排序規則Latin1_General_BIN or Latin1_General_BIN2可以正常工作。

1

您需要使用二進制排序來實現一致的排序。

ORDER BY t.Name ASC COLLATE Latin1_General_BIN 

編輯: 因爲你不能做整理查詢, 則需要在數據庫級別做。

您需要將其設置在您正在比較的列上,並且它需要是二進制的。

Here就是這樣一個例子。

0

您還可以在返回主鍵的CTE上對CAST(VARCHAR)進行排序,並在表上執行連接以獲取NVARCHAR值。