當資料行的「定序(Collation)」不相同時,資料表聯結(Table Join)功能是無法正常執行,將遭遇到以下的錯誤訊息:
訊息 468,層級 16,狀態 9,行 3 無法解析 equal to 作業中 "Chinese_PRC_Stroke_CI_AS" 與 "Chinese_Taiwan_Stroke_CI_AS" 之間的定序衝突。 Msg 468, Level 16, State 9, Line 3 Cannot resolve the collation conflict between "Chinese_PRC_Stroke_CI_AS" and "Chinese_Taiwan_Stroke_CI_AS" in the equal to operation.
請參考以下的範例程式碼:
--00 建立範例資料表:CustomersCHT 與 OrdersCHS USE Northwind GO IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CustomersCHT]') AND type in (N'U')) DROP TABLE [dbo].[CustomersCHT] GO SELECT * INTO CustomersCHT FROM Northwind.dbo.Customers -- IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[OrdersCHS]') AND type in (N'U')) DROP TABLE [dbo].[OrdersCHS] GO SELECT * INTO OrdersCHS FROM Northwind.dbo.Orders -- 分別修改兩個資料表的資料行 CustomerID 之定序為:Chinese_Taiwan_Stroke_CI_AS 與 Chinese_PRC_Stroke_CI_AS ALTER TABLE CustomersCHT ALTER COLUMN CustomerID nchar(5) COLLATE Chinese_Taiwan_Stroke_CI_AS GO ALTER TABLE OrdersCHS ALTER COLUMN CustomerID nchar(5) COLLATE Chinese_PRC_Stroke_CI_AS GO -- 查詢資料庫內,各個資料行的定序之特性 SELECT OBJECT_NAME(C.object_id) N'資料表', C.name N'資料行', C.collation_name N'定序', T.name N'資料行類型', C.max_length N'資料行的最大長度 (Byte)' FROM sys.columns C INNER JOIN sys.types T ON C.user_type_id = T.user_type_id WHERE C.collation_name IS NOT NULL AND C.object_id > 10000 ORDER BY 1
--EX1. 當資料不同時,將遭遇到以下的錯誤訊息: SELECT * FROM CustomersCHT CHT INNER JOIN OrdersCHS CHS ON CHT.CustomerID = CHS.CustomerID /* 訊息 468,層級 16,狀態 9,行 3 無法解析 equal to 作業中 "Chinese_PRC_Stroke_CI_AS" 與 "Chinese_Taiwan_Stroke_CI_AS" 之間的定序衝突。 Msg 468, Level 16, State 9, Line 3 Cannot resolve the collation conflict between "Chinese_PRC_Stroke_CI_AS" and "Chinese_Taiwan_Stroke_CI_AS" in the equal to operation. */
可能的處理方式:
--EX2. 可能的處理方式 --(1) 使用 COLLATE 子句,轉換為定序為:Chinese_Taiwan_Stroke_CI_AS SELECT * FROM CustomersCHT CHT INNER JOIN OrdersCHS CHS ON CHT.CustomerID = CHS.CustomerID COLLATE Chinese_Taiwan_Stroke_CI_AS --(2) 或是使用 COLLATE DATABASE_DEFAULT:使 COLLATE 子句繼承目前資料庫的定序。 SELECT * FROM CustomersCHT CHT INNER JOIN OrdersCHS CHS ON CHT.CustomerID = CHS.CustomerID COLLATE DATABASE_DEFAULT -- 刪除範例資料表:CustomersCHT 與 OrdersCHS IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CustomersCHT]') AND type in (N'U')) DROP TABLE [dbo].[CustomersCHT] GO IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[OrdersCHS]') AND type in (N'U')) DROP TABLE [dbo].[OrdersCHS] GO
參考資料:
無法解析 equal to 作業中...之間的定序衝突(Cannot resolve the collation conflict between...in the equal to operation) :當資料行的定序不相同,資料表聯結無法正常執行(2)
http://sharedderrick.blogspot.com/2011/04/equal-to-cannot-resolve-collation_23.html
使用定序
http://technet.microsoft.com/zh-tw/library/ms187582.aspx
設定與變更資料行定序
http://technet.microsoft.com/zh-tw/library/ms190920.aspx
COLLATE (Transact-SQL)
http://technet.microsoft.com/zh-tw/library/ms184391.aspx
沒有留言:
張貼留言