定序衝突 (Transact-SQL)

當你的 SQL 查詢試圖去比較不同定序的資料欄位時,就會出現如下類似的錯誤訊息:
訊息 468,層級 16,狀態 9,行 1
無法解析 equal to 作業中 "Latin1_General_CI_AI" 與 "Chinese_Taiwan_Stroke_CI_AS" 之間的定序衝突。

以下是在 SQL Server 2005 所引發錯誤的 SQL 查詢範例:
select * from sysobjects o
left join ::fn_Listextendedproperty(null, N'user',N'dbo',N'table', default, null, null) e on o.name = e.objname
where type = 'U'

當你在定序為 Chinese_Taiwan_Stroke_CI_AS 的資料庫,使用 fn_Listextendedproperty 函式與 sysobjects 資料表合併查詢時,就會發生定序衝突(Collation Conflict)的錯誤。這是因為 fn_Listextendedproperty 函式回傳的資料固定是以 Latin1_General_CI_AI 為定序,所以導致定序不一致的情況。

上例的解決作法就是在運算式中,做明確的字串定序轉換,如以下範例:
select * from sysobjects o
left join ::fn_Listextendedproperty(null, N'user',N'dbo',N'table', default, null, null) e on o.name = e.objname COLLATE Chinese_Taiwan_Stroke_CI_AS
where type = 'U'

你也可以利用 COLLATE 子句中的 database_default 選項,指定特定的資料行使用目前連接的使用者資料庫之定序預設值。


Share/Save/Bookmark

1 comments :: 定序衝突 (Transact-SQL)

  1. 你上下2個範例語法都一模一樣

張貼留言