SQL排序規則衝突造成查詢失敗的一例解決辦法

我以前設計的一個JOB一直運行得很正常,後來由於ERP升級以後就無法正常運行了,顯示的錯誤是“Cannot resolve collation conflict for equal to operation”,如圖:
 
分析其原因,系數據庫中的表採用了不同的排序規則造成的。這種排序規則主要對文字部分有效,需要調整字符字段的排序規則,將排序規則調整成默認的排序規則一般就行了。調整方法如下圖:
 
 
以上解決方案是針對我的這次問題的一個個案處理方法,對於更一般的解決方法,下面的例子可以參考:
 
SQL SERVER的排序規則平時使用不是很多,也許不少初學者還比較陌生,但有一個錯誤大家應是經常碰到: SQL SERVER數據庫,在跨庫多表連接查詢時,若兩數據庫默認字符集不同,系統就會返回這樣的錯誤: 
       
           “無法解決 equal to 操作的排序規則衝突。”
 
(英文版SQL的錯誤同上面的截圖)
 


一.錯誤分析:
  這個錯誤是因爲排序規則不一致造成的,我們做個測試,比如:
create table #t1(
name varchar(20) collate Albanian_CI_AI_WS,  
value int)

create table #t2(
name varchar(20) collate Chinese_PRC_CI_AI_WS,    
value int 

表建好後,執行連接查詢:

select * from #t1 A inner join #t2 B on A.name=B.name 

這樣,錯誤就出現了:

           服務器: 消息 446,級別 16,狀態 9,行 1
           無法解決 equal to 操作的排序規則衝突。
  要排除這個錯誤,最簡單方法是,表連接時指定它的排序規則,這樣錯誤就
不再出現了。語句這樣寫:

select * 
from #t1 A inner join #t2 B 
on A.name=B.name collate Chinese_PRC_CI_AI_WS


二.排序規則簡介:

    什麼叫排序規則呢?MS是這樣描述的:"在 Microsoft SQL Server 2000 中,字符串的物理存儲由排序規則控制。排序規則指定表示每個字符的位模式以及存儲和比較字符所使用的規則。"
Microsoft SQL Server 2000 排序規則包括以下分組:
1、Windows排序規則
Windows排序規則基於爲相關聯的Windows區域設置所定義的規則對存儲字符數據的規則進行定義。Windows基本排序規則指定應用字典排序時所用的字母表或語言,以及用於存儲非Unicode字符型數據的代碼頁。
2、SQL排序規則
提供SQL排序規則是爲了與Microsoft SQL Server 早期版本中的排序次序兼容。
 
需要注意的是修改排序規則必須重建或重新裝載數據庫,也就是說排序規則一旦到數據裝好了就不可修改了。  
 

  在查詢分析器內執行下面語句,可以得到SQL SERVER支持的所有排序規則。

    select * from ::fn_helpcollations() 

排序規則名稱由兩部份構成,前半部份是指本排序規則所支持的字符集。
如:
  Chinese_PRC_CS_AI_WS 
前半部份:指UNICODE字符集,Chinese_PRC_指針對大陸簡體字UNICODE的排序規則。
排序規則的後半部份即後綴 含義: 
  _BIN 二進制排序 
  _CI(CS) 是否區分大小寫,CI不區分,CS區分
  _AI(AS) 是否區分重音,AI不區分,AS區分   
  _KI(KS) 是否區分假名類型,KI不區分,KS區分 
    _WI(WS) 是否區分寬度 WI不區分,WS區分 

區分大小寫:如果想讓比較將大寫字母和小寫字母視爲不等,請選擇該選項。
區分重音:如果想讓比較將重音和非重音字母視爲不等,請選擇該選項。如果選擇該選項,
         比較還將重音不同的字母視爲不等。
區分假名:如果想讓比較將片假名和平假名日語音節視爲不等,請選擇該選項。
區分寬度:如果想讓比較將半角字符和全角字符視爲不等,請選擇該選項
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章