其實我想寫這篇文章已經很久了,只是各種條件限制,以至於我不能把我所學到覺得有益於大家的
共用出來。
我希望說的這個技術能對大家有用,以前我做一個大型系統的時候,曾經自己開發了一套控制項,其中
之一是可以模糊查詢供應商名稱的控制項,就是操作人員不必從大量的供應商中選擇或者輸入代碼或者
寫入供應商名稱的全民,有點象金山詞霸一樣的搜尋方式。後來有同事開發了其它系統,他們採用操作
人員輸入漢字拼音的第一個字母方式,我覺得很好,但是後來才知道這些輸入的拼音是建立資料的時候
增加一列來儲存這個拼音的,這種情況給我很大啟發,如何才能把一個任意漢字轉換為該漢字拼音第一個字母呢?我在網上下載了一個Delphi程式的代碼,裡面有絕大部分漢字對應的拼音,我經過處理把這些資料
植入了資料庫並且做了些加工,然後我編寫了一個資料庫函數來轉換。
功能就這樣實現了,我把這個函數代碼貼上來了,但是資料庫的拼音對照表的資料有幾萬條,所以
我以後指定一個地址讓各位有興趣的朋友去下載。
至於效率問題我做過測試:256M記憶體,2.0G賽揚,轉換8萬個漢字需要時間在3秒鐘左右,當然這個功能
主要應用於資料量在幾百幾千的表,主要為操作人員提供方便.
CREATE FUNCTION dbo.SpellCode (
@stText as varchar(1000)
)
RETURNS varchar(1000) as
BEGIN
declare
@ReturnValue as varchar(1000),
@highvalue as int,
@lowvalue as int,
@APy as varchar(10)
set @ReturnValue=''
while ( Len(@stText)>0)
begin
if (left(@stText,1)>='a' and left(@stText,1)<='z') or (left(@stText,1)>='A' and left(@stText,1)<='Z') or (left(@stText,1)>='0' and left(@stText,1)<='9')
begin
set @ReturnValue=@ReturnValue+Upper(left(@stText,1))
set @stText=right(@stText,len(@stText)-1)
continue
end
set @lowvalue=ascii(left(@stText,1))
if @lowvalue<=128 --控制字元及特殊字元不予處理
begin
--set @ReturnValue=@ReturnValue+Upper(left(@stText,1)) 如果需要可以顯示
set @stText=right(@stText,len(@stText)-1)
continue
end
set @highvalue=cast(cast(left(@stText,1) as varbinary) as int)-@lowvalue*256
if @lowvalue=166 --希臘字母
begin
set @Apy=
case when @highvalue>=161 and @highvalue<=184 then (select left(infovalue,1) from ChineseSpellS where rowid=@highvalue-160 and typeinfo=3)
when @highvalue>=193 and @highvalue<=216 then (select left(infovalue,1) from ChineseSpellS where rowid=@highvalue-192 and typeinfo=3 )
end
set @ReturnValue=@ReturnValue+Upper(@Apy)
set @stText=right(@stText,len(@stText)-1)
continue
end
-- 獲得拼音索引
select @Apy=left(infovalue,1) from ChineseSpell with (nolock) where rowid=@lowvalue-128 and subid=@highvalue-63
if @Apy is null set @Apy=dbo.ChToEn(left(@stText,1))
set @ReturnValue = @ReturnValue + upper(@APy)
set @stText=right(@stText,len(@stText)-1)
end
return @ReturnValue
END