Issue: Cannot resolve the collation conflict between "Chinese_PRC_CI_AS" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation.
Issue
在某跨國企業,有一天,DBA在北京這邊建立了一個用於測試的資料庫伺服器,這個DB Server我們就稱為 CH01 吧。
有一天,開發人員在 CH01 上運行業務系統,結果凡是用到了暫存資料表的預存程序都出錯了。錯誤碼如下:
Msg 468, Level 16, State 9, Procedure CIU_PCUDefaultStreams_SP_Temp_Panel, Line 250Cannot resolve the collation conflict between "Chinese_PRC_CI_AS" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation.
Analysis
業務資料庫的定序設定(Collation settings)是:SQL_Latin1_General_CP1_CI_AS.
但是,CH01 這個DB Server的服務期定序設定是Chinese_PRC_CI_AS
所以,暫存資料表資料庫 tempdb 的定序設定(collation settings)和伺服器定序設定一樣,也是Chinese_PRC_CI_AS。
當業務資料庫裡面的預存程序建立暫存資料表,這些暫存資料表是建立在 tempdb 裡面的。所以暫存資料表的定序設定(collation settings)也都是Chinese_PRC_CI_AS。
所以,當業務資料庫裡面的物理表和 tempdb 裡面暫存資料表進行聯集查詢的時候,就出錯了。
How to resolve
解決的辦法有三個:
1. 建立表(包括暫存資料表)時,可以指定表的定序設定(collation settings)。
2. 在查詢語句中可以指定定序設定。
3. 可以在建立資料庫的時候指定定序設定,或者建立資料庫後可以改變定序設定。