解決資料庫查詢時定序衝突

跨兩個不同 SQL Server 資料庫執行查詢指令,出現錯誤訊息如下

無法解析 equal to 作業中 "Chinese_Taiwan_Stroke_CI_AS" 與 "Latin1_General_100_CI_AS" 之間的定序衝突。

發生原因

當查詢兩個以上不同的資料庫,當兩者定序不一致時 Join 查詢資料則會發生這項錯誤。

SQL Server 中定序是在建立資料庫時決定,所有資料表、欄位的定序會參照資料庫的設定。

可以針對單一資料表或欄位調整定序,不過遇到不同定序的欄位比對則需要先轉換為一致的定序。

 

解決方法

查詢時將外點資料欄位定序轉換跟本地資料庫端的定序一致,轉換指令: collate,參閱 COLLATE (Transact-SQL) 

1. 查詢時轉換定序

串接的欄位時指定轉換的定序,將原本查詢與法修改如下:

SELECT*
FROM DB1.dbo.table1 A, DB2.dbo.table2 B 
WHERE A.PK1 = (B.PK1 collate Latin1_General_100_CI_AS)

 

2. 修改 View 結構

上述的作法,必須在每次串聯查詢都做一次轉換。

若使用頻繁,可以另外建立一個 View,針對會 Join 的欄位先設定好定序,在爾後查詢就不用逐一轉換。

以下範例僅針對其中一個欄位設定轉換定序,設定愈多欄位是會影響效能,需斟酌設地。參考語法如下:

CREATE VIEW [dbo].[viewTable2]
AS
SELECT
(PK1  collate Latin1_General_100_CI_AS) AS PK1
, COL2
, COL3
, …
FROM DB2.dbo.table2 B

GO

建立好 View 後,原本的查詢可以直接串聯

SELECT*
FROM DB1.dbo.table1 A, viewTable2 B 
WHERE A.PK1 = B.PK1

 

延伸閱讀

[SQL Server]談談SQL Server的定序(Collation) – from gipi