解決資料庫查詢時定序衝突
跨兩個不同 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