国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQL Server > 正文

整理一下SQLSERVER的排序規則

2020-07-25 13:41:27
字體:
來源:轉載
供稿:網友
SQL SERVER的排序規則平時使用不是很多,也許不少初學者還比較陌生,但有
一個錯誤大家應是經常碰到:  SQL  SERVER數據庫,在跨庫多表連接查詢時,若兩數據
庫默認字符集不同,系統就會返回這樣的錯誤:  

                     “無法解決  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區分 

區分大小寫:如果想讓比較將大寫字母和小寫字母視為不等,請選擇該選項。
區分重音:如果想讓比較將重音和非重音字母視為不等,請選擇該選項。如果選擇該選項,
                 比較還將重音不同的字母視為不等。
區分假名:如果想讓比較將片假名和平假名日語音節視為不等,請選擇該選項。
區分寬度:如果想讓比較將半角字符和全角字符視為不等,請選擇該選項

 
三.排序規則的應用:
  SQL  SERVER提供了大量的WINDOWS和SQLSERVER專用的排序規則,但它的應用往往
被開發人員所忽略。其實它在實踐中大有用處。

  例1:讓表NAME列的內容按拼音排序:

create  table  #t(id  int,name  varchar(20))
insert  #t  select  1,'中'
union  all  select  2,'國'
union  all  select  3,'人'
union  all  select  4,'阿'

select  *  from  #t  order  by  name  collate  Chinese_PRC_CS_AS_KS_WS  
drop  table  #t
/*結果:
id                    name                                  
-----------  --------------------  
4                      阿
2                      國
3                      人
1                      中
*/

  例2:讓表NAME列的內容按姓氏筆劃排序:

create  table  #t(id  int,name  varchar(20))

insert  #t  select  1,'三'
union  all  select  2,'乙'
union  all  select  3,'二'
union  all  select  4,'一'
union  all  select  5,'十'
select  *  from  #t  order  by  name  collate  Chinese_PRC_Stroke_CS_AS_KS_WS    
drop  table  #t
/*結果:
id                    name                                  
-----------  --------------------  
4                      一
2                      乙
3                      二
5                      十
1                      三
*/

四.在實踐中排序規則應用的擴展
  SQL  SERVER漢字排序規則可以按拼音、筆劃等排序,那么我們如何利用這種功能
來處理漢字的一些難題呢?我現在舉個例子:

          用排序規則的特性計算漢字筆劃

  要計算漢字筆劃,我們得先做準備工作,我們知道,WINDOWS多國漢字,UNICODE目前
收錄漢字共20902個。簡體GBK碼漢字UNICODE值從19968開始。
  首先,我們先用SQLSERVER方法得到所有漢字,不用字典,我們簡單利用SQL語句就
可以得到:

select  top  20902  code=identity(int,19968,1)  into  #t  from  syscolumns  a,syscolumns  b

再用以下語句,我們就得到所有漢字,它是按UNICODE值排序的:

  select  code,nchar(code)  as  CNWord  from  #t  

  然后,我們用Select語句,讓它按筆劃排序。

select  code,nchar(code)  as  CNWord  
from  #t  
order  by  nchar(code)  collate  Chinese_PRC_Stroke_CS_AS_KS_WS,code

結果:
code                CNWord  
-----------  ------  
19968              一
20008              丨
20022              丶
20031              丿
20032               主站蜘蛛池模板: 罗江县| 瑞昌市| 泾源县| 临沭县| 射洪县| 文登市| 衡水市| 太湖县| 麻城市| 米易县| 孟村| 平山县| 平度市| 盘锦市| 吉安县| 诏安县| 龙江县| 贵州省| 宁河县| 台山市| 惠州市| 巴楚县| 晋城| 信阳市| 潼关县| 乌拉特后旗| 固阳县| 江油市| 溆浦县| 三台县| 微山县| 滕州市| 睢宁县| 山阴县| 安化县| 陈巴尔虎旗| 客服| 朝阳县| 汉阴县| 游戏| 方山县|