2011-04-19

無法解析 equal to 作業中...之間的定序衝突(Cannot resolve the collation conflict between...in the equal to operation) :當資料行的定序不相同,資料表聯結無法正常執行;Msg 468, Level 16, State 9, Line 3 (1)



當資料行的「定序(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

沒有留言:

張貼留言