if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_convert]') and xtype in (N'FN', N'IF', N'TF')) drop function [dbo].[f_convert] GO
/*--全角/半角轉(zhuǎn)換
轉(zhuǎn)換說明 全角字符從的unicode編碼從65281~65374 半角字符從的unicode編碼從 33~126 空格比較特殊,全角為 12288,半角為 32 而且除空格外,全角/半角按unicode編碼排序在順序上是對(duì)應(yīng)的 所以可以直接通過用+-法來處理非空格數(shù)據(jù),對(duì)空格單獨(dú)處理 like的時(shí)候,指定排序規(guī)則 COLLATE Latin1_General_BIN 是保證字符順序按unicode編碼排序 (此函數(shù)部分思路參考了CSDN上大力的轉(zhuǎn)換函數(shù)) --鄒建 2005.01(引用請(qǐng)保留此信息)--*/
/*--調(diào)用示例
declare @s1 varchar(8000) select @s1='中 2-3456a78STUVabn中國(guó)opwxyz' select dbo.f_convert(@s1,0),dbo.f_convert(@s1,1) --*/ create function f_convert( @str nvarchar(4000), --要轉(zhuǎn)換的字符串 @flag bit --轉(zhuǎn)換標(biāo)志,0轉(zhuǎn)換成半角,1轉(zhuǎn)換成全角 )returns nvarchar(4000) as begin declare @pat nvarchar(8),@step int,@i int,@spc int if @flag=0 select @pat=N'%[!-~ ]%',@step=-65248 else select @pat=N'%[!-~ ]%',@step=65248 set @i=patindex(@pat COLLATE Latin1_General_BIN,@str) while @i>0 select @str=stuff(@str,@i,1,nchar(case unicode(substring(@str,@i,1)) when 32 then 12288 when 12288 then 32 else unicode(substring(@str,@i,1))+@step end)) ,@i=patindex(@pat COLLATE Latin1_General_BIN,@str) return(@str) end go |
|