天天看點

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區分 

區分大小寫:如果想讓比較将大寫字母和小寫字母視為不等,請選擇該選項。

區分重音:如果想讓比較将重音和非重音字母視為不等,請選擇該選項。如果選擇該選項,

         比較還将重音不同的字母視為不等。

區分假名:如果想讓比較将片假名和平假名日語音節視為不等,請選擇該選項。

區分寬度:如果想讓比較将半角字元和全角字元視為不等,請選擇該選項

     本文轉自fengyp 51CTO部落格,原文連結:http://blog.51cto.com/fengyp/290931,如需轉載請自行聯系原作者