在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,它阻止了我在這裏進行任何投射) - 如何讓排序以所需的方式工作(首先顯示帶有非字母數字值的項目)?
我希望有某種數據庫/服務器級別的排序規則設置...任何想法?
這裏描述了行爲的原因。 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
感謝您的評論,這正是描述我所看到的行爲......現在我只是需要解決方案!我不介意更改數據庫的排序規則設置,是否有一個會產生我想要的結果(並仍然允許使用unicode列等)? – DanP 2010-07-09 14:53:33
你可以使用'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