婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 整理一下SQLSERVER的排序規則

整理一下SQLSERVER的排序規則

熱門標簽:電話機器人接口是什么樣的 四川穩定外呼系統公司 福州外呼系統招商 怎么在高德地圖標注多個點 溫州語音外呼系統排名 百度地圖標注信息怎么修改 沈陽外呼系統有效果嗎 商家地圖標注圖片 AI智能云呼電話機器人怎么注冊
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              乀
20033              乁
20057              乙
20058              乚
20059              乛
20101              亅
19969              丁
..........

     從上面的結果,我們可以清楚的看到,一筆的漢字,code是從19968到20101,從小到大排,但到
了二筆漢字的第一個字“丁”,CODE為19969,就不按順序而重新開始了。有了這結果,我們就可以輕
松的用SQL語句得到每種筆劃漢字歸類的第一個或最后一個漢字。
下面用語句得到最后一個漢字:

create  table  #t1(id  int  identity,code  int,cnword  nvarchar(2))

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

select  A.cnword  
from  #t1  A  
left  join  #t1  B  on  A.id=B.id-1  and  A.codeB.code  
where  B.code  is  null
order  by  A.id

得到36個漢字,每個漢字都是每種筆劃數按Chinese_PRC_Stroke_CS_AS_KS_WS排序規則排序后的
最后一個漢字:

亅阝馬風龍齊龜齒鴆齔龕龂齠齦齪龍龠龎龐龑龡龢龝齹龣龥齈龞麷鸞麣龖龗齾齉龘

  上面可以看出:“亅”是所有一筆漢字排序后的最后一個字,“阝”是所有二筆漢字排序后的最后
一個字......等等。
  但同時也發現,從第33個漢字“龗(33筆)”后面的筆劃有些亂,不正確。但沒關系,比“龗”筆劃
多的只有四個漢字,我們手工加上:齾35筆,齉36筆,靐39筆,龘64筆

建漢字筆劃表(TAB_HZBH):
create  table  tab_hzbh(id  int  identity,cnword  nchar(1))
--先插入前33個漢字
insert  tab_hzbh
select  top  33  A.cnword  
from  #t1  A  
left  join  #t1  B  on  A.id=B.id-1  and  A.codeB.code  
where  B.code  is  null
order  by  A.id
--再加最后四個漢字
set  identity_insert  tab_hzbh  on
go
insert  tab_hzbh(id,cnword)
     select  35,N'齾'
union  all  select  36,N'齉'
union  all  select  39,N'靐'
union  all  select  64,N'龘'
go
set  identity_insert  tab_hzbh  off
go

  到此為止,我們可以得到結果了,比如我們想得到漢字“國”的筆劃:

declare  @a  nchar(1)
set  @a='國'
select  top  1  id  
from    tab_hzbh  
where  cnword>=@a  collate  Chinese_PRC_Stroke_CS_AS_KS_WS
order  by  id

id                    
-----------  
8
(結果:漢字“國”筆劃數為8)

  上面所有準備過程,只是為了寫下面這個函數,這個函數撇開上面建的所有臨時表和固
定表,為了通用和代碼轉移方便,把表tab_hzbh的內容寫在語句內,然后計算用戶輸入一串
漢字的總筆劃:

create  function  fun_getbh(@str  nvarchar(4000))
returns  int
as
begin
declare  @word  nchar(1),@n  int
set  @n=0
while  len(@str)>0
begin
set  @word=left(@str,1)
--如果非漢字,筆劃當0計
set  @n=@n+(case  when  unicode(@word)  between  19968  and  19968+20901
then  (select  top  1  id  from  (
select  1  as  id,N'亅'  as  word  
union  all  select  2,N'阝'  
union  all  select  3,N'馬'  
union  all  select  4,N'風'  
union  all  select  5,N'龍'  
union  all  select  6,N'齊'  
union  all  select  7,N'龜'  
union  all  select  8,N'齒'  
union  all  select  9,N'鴆'  
union  all  select  10,N'齔'  
union  all  select  11,N'龕'  
union  all  select  12,N'龂'  
union  all  select  13,N'齠'  
union  all  select  14,N'齦'  
union  all  select  15,N'齪'  
union  all  select  16,N'龍'  
union  all  select  17,N'龠'  
union  all  select  18,N'龎'  
union  all  select  19,N'龐'  
union  all  select  20,N'龑'  
union  all  select  21,N'龡'  
union  all  select  22,N'龢'  
union  all  select  23,N'龝'  
union  all  select  24,N'齹'  
union  all  select  25,N'龣'  
union  all  select  26,N'龥'  
union  all  select  27,N'齈'  
union  all  select  28,N'龞'  
union  all  select  29,N'麷'  
union  all  select  30,N'鸞'  
union  all  select  31,N'麣'  
union  all  select  32,N'龖'  
union  all  select  33,N'龗'  
union  all  select  35,N'齾'  
union  all  select  36,N'齉'  
union  all  select  39,N'靐'  
union  all  select  64,N'龘'  
)  T  
where  word>=@word  collate  Chinese_PRC_Stroke_CS_AS_KS_WS
order  by  id  ASC)  else  0  end)
set  @str=right(@str,len(@str)-1)
end
return  @n
end

--函數調用實例:
select  dbo.fun_getbh('中華人民共和國'),dbo.fun_getbh('中華人民共和國')
 
  執行結果:筆劃總數分別為39和46,簡繁體都行。

       當然,你也可以把上面“UNION ALL”內的漢字和筆劃改存在固定表內,在漢字
列建CLUSTERED  INDEX,列排序規則設定為:
     Chinese_PRC_Stroke_CS_AS_KS_WS
這樣速度更快。如果你用的是BIG5碼的操作系統,你得另外生成漢字,方法一樣。
但有一點要記住:這些漢字是通過SQL語句Select出來的,不是手工輸入的,更不
是查字典得來的,因為新華字典畢竟不同于UNICODE字符集,查字典的結果會不正
確。

  
                       用排序規則的特性得到漢字拼音首字母

  用得到筆劃總數相同的方法,我們也可以寫出求漢字拼音首字母的函數。如下:

create  function  fun_getPY(@str  nvarchar(4000))
returns  nvarchar(4000)
as
begin
declare  @word  nchar(1),@PY  nvarchar(4000)
set  @PY=''
while  len(@str)>0
begin
set  @word=left(@str,1)
--如果非漢字字符,返回原字符
set  @PY=@PY+(case  when  unicode(@word)  between  19968  and  19968+20901
then  (select  top  1  PY  from  (
select  'A'  as  PY,N'驁'  as  word
union  all  select  'B',N'簿'
union  all  select  'C',N'錯'
union  all  select  'D',N'鵽'
union  all  select  'E',N'樲'
union  all  select  'F',N'鰒'
union  all  select  'G',N'腂'
union  all  select  'H',N'夻'
union  all  select  'J',N'攈'
union  all  select  'K',N'穒'
union  all  select  'L',N'鱳'
union  all  select  'M',N'旀'
union  all  select  'N',N'桛'
union  all  select  'O',N'漚'
union  all  select  'P',N'曝'
union  all  select  'Q',N'囕'
union  all  select  'R',N'鶸'
union  all  select  'S',N'蜶'
union  all  select  'T',N'籜'
union  all  select  'W',N'鶩'
union  all  select  'X',N'鑂'
union  all  select  'Y',N'韻'
union  all  select  'Z',N'咗'
)  T  
where  word>=@word  collate  Chinese_PRC_CS_AS_KS_WS  
order  by  PY  ASC)  else  @word  end)
set  @str=right(@str,len(@str)-1)
end
return  @PY
end

--函數調用實例:
select  dbo.fun_getPY('中華人民共和國'),dbo.fun_getPY('中華人民共和國')
結果都為:ZHRMGHG

     你若有興趣,也可用相同的方法,擴展為得到漢字全拼的函數,甚至還可以得到全拼的讀
音聲調,不過全拼分類大多了。得到全拼最好是用對照表,兩萬多漢字搜索速度很快,用對照
表還可以充分利用表的索引。
       排序規則還有很多其它的巧妙用法。歡迎大家共同探討。
您可能感興趣的文章:
  • SQLserver排序規則基本概念探索

標簽:營口 邯鄲 七臺河 西寧 來賓 無錫 寶雞 汕尾

巨人網絡通訊聲明:本文標題《整理一下SQLSERVER的排序規則》,本文關鍵詞  整理,一下,SQLSERVER,的,排序,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《整理一下SQLSERVER的排序規則》相關的同類信息!
  • 本頁收集關于整理一下SQLSERVER的排序規則的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    成人18精品视频| 一区二区日韩电影| 欧美老肥妇做.爰bbww| 精品日韩在线观看| 日韩综合小视频| 欧美伊人精品成人久久综合97| 日本一区二区三区高清不卡| 国产精品一区二区91| 欧美激情一区在线| 国产一区二区久久| 国产女主播在线一区二区| www.在线欧美| 亚洲伦理在线免费看| 欧美日韩一区二区三区不卡| 亚洲高清免费观看| 精品国产乱子伦一区| 成人一区二区三区在线观看| 亚洲va国产天堂va久久en| 日韩综合一区二区| 中文字幕国产一区| 69堂成人精品免费视频| 国产成人在线观看免费网站| 国产亚洲成av人在线观看导航 | 国产精品萝li| 91蝌蚪porny九色| 日日夜夜精品视频免费| 91视频免费观看| 国内精品在线播放| 亚洲午夜一区二区三区| 久久婷婷成人综合色| 91精品国产福利| 91免费版pro下载短视频| 国产在线精品免费av| 偷偷要91色婷婷| 亚洲三级小视频| 精品在线观看视频| 国产精品免费网站在线观看| 在线亚洲免费视频| 国精产品一区一区三区mba桃花 | 91在线码无精品| 久久99久久99小草精品免视看| 精品视频资源站| 国产精品白丝在线| 26uuu色噜噜精品一区二区| 久久国产尿小便嘘嘘| 日本vs亚洲vs韩国一区三区二区 | 国产精品久久久久桃色tv| 欧美日韩激情在线| 亚洲欧洲精品一区二区三区| 玉足女爽爽91| 正在播放亚洲一区| 亚洲视频 欧洲视频| 亚洲制服丝袜一区| 精品亚洲免费视频| 99视频精品免费视频| 欧美精品一卡二卡| 色爱区综合激月婷婷| 精品99999| 中文字幕一区二区三| 色综合久久久久综合体桃花网| 欧美日韩亚州综合| 欧美老女人在线| 日韩欧美一级精品久久| 久久久精品天堂| 亚洲永久精品国产| 国产一区二区三区电影在线观看| 成人精品视频一区| 欧美电视剧免费全集观看 | 亚洲欧洲成人自拍| 国产精品无遮挡| 日韩高清一级片| 国产69精品久久久久毛片| 欧美日韩中文字幕一区二区| 精品va天堂亚洲国产| 免费看日韩a级影片| 欧美日韩一区二区三区四区| 国产精品卡一卡二卡三| 国产在线一区二区综合免费视频| 欧美日韩中文字幕一区| 亚洲国产日韩在线一区模特| 波波电影院一区二区三区| 九一久久久久久| 国产无一区二区| 日韩不卡一区二区三区| 亚洲精品国产第一综合99久久| 国模大尺度一区二区三区| 久久品道一品道久久精品| 国产一区二区三区av电影| 精品国产污网站| aaa国产一区| 日韩二区在线观看| 国产亚洲欧美色| 日韩一区欧美小说| 色综合久久综合网欧美综合网| 国产精品视频第一区| 欧美亚洲禁片免费| 国产在线播精品第三| 国产精品家庭影院| 91麻豆精品国产综合久久久久久| 极品少妇xxxx精品少妇偷拍| 久久久久国产精品麻豆ai换脸| 不卡的看片网站| 老汉av免费一区二区三区 | 国产日韩欧美电影| 麻豆国产精品视频| 亚洲欧洲另类国产综合| 污片在线观看一区二区| 欧美精品一区二区三区蜜桃视频| 成人白浆超碰人人人人| 国产精品久久久久7777按摩| 蜜臀99久久精品久久久久久软件| 中文字幕制服丝袜成人av| 日韩欧美区一区二| 欧美日韩成人在线| 欧美性猛交xxxx乱大交退制版 | 91精品国产欧美一区二区| 一二三区精品视频| 5月丁香婷婷综合| 日韩精品一二三| 蜜臀av一区二区在线免费观看| 欧美一区二区三区人| 欧美色综合影院| 一本大道久久a久久精品综合| 精品午夜久久福利影院| 欧美激情一区二区三区全黄| 亚洲三级视频在线观看| 久久精品视频免费| 中文成人综合网| 亚洲免费大片在线观看| 中文字幕制服丝袜成人av| 亚洲视频你懂的| 亚洲精品日韩专区silk| 亚洲综合一二区| 亚洲成人激情自拍| 精品一区二区三区的国产在线播放| 亚洲与欧洲av电影| 久久久久综合网| 日韩免费观看高清完整版 | 亚洲一区二区三区国产| 欧美高清在线精品一区| 亚洲欧美一区二区不卡| 亚洲成人手机在线| 国产成人精品亚洲777人妖| 久99久精品视频免费观看| 欧美专区日韩专区| 国产成人在线网站| 日韩高清在线电影| 亚洲女爱视频在线| 亚洲精品一线二线三线| 欧美亚洲丝袜传媒另类| 成人av在线看| 国内国产精品久久| 性久久久久久久| 亚洲地区一二三色| 最新国产の精品合集bt伙计| 精品欧美一区二区三区精品久久 | 色综合久久中文字幕| 国产精品资源在线| 日韩av一级片| 亚洲国产综合色| 亚洲日本在线天堂| 国产精品久久久久7777按摩 | 国产高清亚洲一区| 国模套图日韩精品一区二区| 三级一区在线视频先锋| 一区二区成人在线| 1024成人网| 亚洲一区在线观看免费| 亚洲猫色日本管| 亚洲日本护士毛茸茸| 一区二区成人在线视频| 亚洲一区二区三区自拍| 日日夜夜免费精品| 韩国成人精品a∨在线观看| 日本视频免费一区| 韩国v欧美v亚洲v日本v| 成人午夜大片免费观看| 99精品视频免费在线观看| 欧美伊人久久久久久午夜久久久久| jlzzjlzz亚洲女人18| 欧美中文一区二区三区| 日韩一区二区三区四区| 国产日韩欧美制服另类| 一区二区三区在线播| 麻豆成人久久精品二区三区小说| 国产一区二区电影| 在线亚洲免费视频| 日韩欧美在线网站| 国产精品麻豆99久久久久久| 午夜国产精品影院在线观看| 精久久久久久久久久久| 色视频一区二区| 精品国产乱码久久久久久影片| 国产精品毛片大码女人| 欧美视频一区在线| 日韩成人一区二区三区在线观看| 久久精品国产亚洲高清剧情介绍 | 精品精品国产高清一毛片一天堂| 中文字幕在线不卡一区二区三区| 日韩av中文字幕一区二区|