日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL Server 排序规则(摘)

發(fā)布時間:2023/12/9 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL Server 排序规则(摘) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

3Sql Server數(shù)據(jù)庫,在跨庫多表連接查詢時,若兩數(shù)據(jù)庫默認(rèn)字符集不同,系統(tǒng)就會返回這樣的錯誤:“無法解決equal to操作的排序規(guī)則沖突”

一、錯誤分析:
這個錯誤是因?yàn)榕判蛞?guī)則不一致造成的,比如:
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
解決這個問題語句可以這樣寫:
select?*?from?#t1?A?inner?join?#t2?B?on?A.name=B.name?collate?Chinese_PRC_CI_AI_WS??

二、排序規(guī)則簡介:
MS是這樣描述的:“在Microsoft SQL Server 2000中,字符串的物理存儲由排序規(guī)則控制。排序規(guī)則指定表示每個字符的位模式以及存儲和比較字符所使用的規(guī)則。”
在查詢分析器內(nèi)執(zhí)行下面語句,可以得到Sql Server支持的所有排序規(guī)則
select?*?from?::fn_helpcollations()
排序規(guī)則名稱由兩部分構(gòu)成,前半部份是指本排序規(guī)則支持的字符集。
如:Chinese_PRC_CS_AI_WS
前半部分:指UNICODE字符集,Chinese_PRC_指針對大陸簡體字UNICODE的排序規(guī)則。
排序規(guī)則的后半部分含義:
? ? _BIN二進(jìn)制排序
? ? _CI(CS)是否區(qū)分大小寫,CI不區(qū)分,CS區(qū)分
? ? _AI(AS)是否區(qū)分重音,AI不區(qū)分,AS區(qū)分
? ? _KI(KS)是否區(qū)分假名類型,KI不區(qū)分,KS區(qū)分
? ? _WI(WS)是否區(qū)分寬度,WI不區(qū)分,WS區(qū)分
區(qū)分大小寫:是否想讓比較將大寫字母和小寫字母視為不等
區(qū)分重音:是否想讓比較將重音和非重音字母視為不等
區(qū)分假名:是否想讓比較將片假名和平假名日語音節(jié)視為不等
區(qū)分寬度:是否想讓比較將半角字符和全角字符視為不等

三、排序規(guī)則的應(yīng)用:
例1:讓表name列的內(nèi)容按拼音排序
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???

droptable?#t
/*結(jié)果:
id????????? name ? ? ? ? ? ? ? ??
----------- --------------------?
4?????????? 阿
2?????????? 國
3?????????? 人
1?????????? 中
*/
例2:讓表NAME列的內(nèi)容按姓氏筆劃排序
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?

/*結(jié)果:
id????????? name ? ? ? ? ? ? ? ??
----------- --------------------?
4?????????? 一
2?????????? 乙
3?????????? 二
5?????????? 十
1?????????? 三
*/

四、在實(shí)踐中排序規(guī)則應(yīng)用的擴(kuò)展
例1:用排序規(guī)則的特性計算漢字筆劃
要計算漢字筆劃,Windows多國漢字,Unicode目前收錄漢字共20902個。簡體GBK碼漢字Unicode值從19968開始。
首先,我們先用SqlServer方法得到所有漢字,用Sql語句就可以得到:
select?top?20902?code=identity(int,19968,1)?into?#t?from?syscolumns?a,syscolumns?b
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
從上面的結(jié)果可以看出,一筆的漢字,code是從19968到20101,從小到大排,但到了二筆漢字的第一個字“丁”,code為19969,就不按順序而重新開始了。有了這個結(jié)果,就可以輕松用Sql語句得到每種筆劃漢字歸類的第一個或最后一個漢字。
下面用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.code<B.code?where?B.code?is?null?order?by?A.id
得到36個漢字,每個漢字都是每種筆劃數(shù)按Chinese_PRC_Stroke_CS_AS_KS_WS排序規(guī)則排序后的最后一個漢字:
亅阝馬風(fēng)龍齊龜齒鴆齔龕龂齠齦齪龍龠龎龐龑龡龢龝齹龣龥齈龞麷鸞麣龖龗齾齉龘
上面可以看出,“亅”是所有一筆漢字排序后的最后一個字,“阝”是所有二筆漢字排序后的最后一個字……等等。但同時也發(fā)現(xiàn),從第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.code<B.code?where?B.code?is?null?order?by?A.id

--再加最后四個漢字
set?identity_insert?tab_hzbh?on

insert?tab_hzbh(id,cnword)?select?35,N''?union?all?select?36,N''?union?all?select?39,N''?union?all?select?64,N''
set?identity_insert?tab_hzbh?off 到此為止,我們就可以得到結(jié)果了。比如我們想得到漢字“國”的筆劃:
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
(結(jié)果:漢字“國”筆劃數(shù)為8)
有了上面的準(zhǔn)備,可以寫這樣一個函數(shù),用來計算字符串中漢字的筆劃數(shù):
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)
????????--如果非漢字,筆劃當(dāng)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'風(fēng)'?
????????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

函數(shù)調(diào)用實(shí)例:

select?dbo.fun_getbh('中華人民共和國'),dbo.fun_getbh('中華人民共和國')
執(zhí)行結(jié)果:筆劃總數(shù)分別為36和46。
例2:用排序規(guī)則得到漢字拼音首字母
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
函數(shù)調(diào)用實(shí)例:
select?dbo.fun_getPY('中華人民共和國'),dbo.fun_getPY('中華人民共和國')
執(zhí)行結(jié)果:ZHRMGHG

例3:獲取漢字字符串的拼音首字母
if?exists?(select?*?from?dbo.sysobjects?where?id?=?object_id(N'[dbo].[fGetPy]')?and?xtype?in?(N'FN',?N'IF',?N'TF'))
????drop?function?[dbo].[fGetPy]
GO
--創(chuàng)建取拼音函數(shù)
create?function?fGetPy(@Str?varchar(500)='')

returns?varchar(500)
as
begin
?declare?@strlen?int,@return?varchar(500),@ii?int
?declare?@n?int,@c?char(1),@chn?nchar(1)

?select?@strlen=len(@str),@return='',@ii=0
?set?@ii=0
?while?@ii<@strlen
?begin
??select?@ii=@ii+1,@n=63,@chn=substring(@str,@ii,1)
??if?@chn>'z'
??select?@n?=?@n?+1
?????,@c?=?case?chn?when?@chn?then?char(@n)?else?@c?end
???from(
????select?top?27?*?from?(
?????select?chn?=?''
?????union?all?select?''
?????union?all?select?''
?????union?all?select?''
?????union?all?select?''
?????union?all?select?'發(fā)'
?????union?all?select?''
?????union?all?select?''
?????union?all?select?''??--because?have?no?'i'
?????union?all?select?''

?????union?all?select?''
?????union?all?select?''
?????union?all?select?''
?????union?all?select?''
?????union?all?select?''
?????union?all?select?''
?????union?all?select?''
?????union?all?select?''
?????union?all?select?''
?????union?all?select?''
?????union?all?select?''??--no?'u'
?????union?all?select?''??--no?'v'
?????union?all?select?''

?????union?all?select?''
?????union?all?select?''
?????union?all?select?''
?????union?all?select?@chn)?as?a
????order?by?chn?COLLATE?Chinese_PRC_CI_AS?
???)?as?b
??else?set?@c='a'
??set?@return=@return+@c
?end
?return(@return)
end
go
--測試
select?dbo.fgetpy('東莞市')?as?東莞市,dbo.fgetpy('ab中c國人')?as?中國人

--刪除拼音函數(shù)
drop?function?fgetpy?
-------------------------------------------------------------------------------------------------------------------------------------------
摘自:http://www.cnblogs.com/hzuIT/articles/947411.html

總結(jié)

以上是生活随笔為你收集整理的SQL Server 排序规则(摘)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。