無法解決 equal to 操作中 "SQL_Latin1_General_CP1_CI_AS" 和 "Chinese_PRC_CI_AS" 之間 2011-03-11 15:26:57 分類: 資料庫開發技術 2011年03月10日 CCE3.03的伺服器採用英文的2003R2 資料庫排序規則為拉... ...
無法解決 equal to 操作中 "SQL_Latin1_General_CP1_CI_AS" 和 "Chinese_PRC_CI_AS" 之間 2011-03-11 15:26:57
分類: 資料庫開發技術
2011年03月10日
CCE3.03的伺服器採用英文的2003R2 資料庫排序規則為拉丁文忽略大小寫.
我的存儲過程中遇到了"無法解決 equal to 操作中 "SQL_Latin1_General_CP1_CI_AS" 和 "Chinese_PRC_CI_AS" 之間的排序規則衝突。"百度一下 ^_^
由於採用了 臨時表 導致使用了資料庫預設的字元排序規則 導致:
表sohead欄位so_num的Collate跟資料庫預設的Collate不一樣造成的,創建臨時表,對字元類型的欄位使用資料庫預設的Collate,如果這個跟表的欄位Collate不同時,SQL Server無法對這兩個欄位進行比較
解決:把sohead欄位so_num的Collate改成跟資料庫預設的一致,或者改資料庫預設的Collate,或者創建臨時表時指定Collate
附錄:
在執行SQL語句時,可能會遇到:“無法解決 equal to 操作中的 **** 和 *******排序規則衝突”
一.錯誤分析:
這個錯誤是因為排序規則不一致造成的,我們做個測試,比如:
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 中,
字元串的物理存儲由排序規則控制。排序規則指定表示每個字元的位模式以及存
儲和比較字元所使用的規則。"
在查詢分析器內執行下麵語句,可以得到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區分
區分大小寫:如果想讓比較將大寫字母和小寫字母視為不等,請選擇該選項。
區分重音:如果想讓比較將重音和非重音字母視為不等,請選擇該選項。如果選擇該選項,
比較還將重音不同的字母視為不等。
區分假名:如果想讓比較將片假名和平假名日語音節視為不等,請選擇該選項。
區分寬度:如果想讓比較將半形字元和全形字元視為不等,請選擇該選項
三、解決方法
1.將資料庫中一個表的欄位改成與另一個表中要比較的欄位相同的排序規則。
2.在SQL語句的Where子句後面加上類似這樣的SQL片段:collate Chinese_PRC_CI_AI_WS
如:
Select A.* From A,B Where A.a = B.b collate Chinese_PRC_CI_AI_WS
[@more@]