日期:2014-05-19  浏览次数:20524 次

半角转化为全角问题~~~!
数据库中的数据是半角的,希望通过查询显示出来的事全角的,菜鸟问题,高手指点!

------解决方案--------------------
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

/*--全角/半角转换
转换说明
全角字符从的unicode编码从65281~65374
半角字符从的unicode编码从 33~126
空格比较特殊,全角为 12288,半角为 32
而且除空格外,全角/半角按unicode编码排序在顺序上是对应的
所以可以直接通过用+-法来处理非空格数据,对空格单独处理
like的时候,指定排序规则 COLLATE Latin1_General_BIN
是保证字符顺序按unicode编码排序
(此函数部分思路参考了CSDN上大力的转换函数)
--邹建 2005.01(引用请保留此信息)--*/

/*--调用示例

declare @s1 varchar(8000)
select @s1= '中  2-3456a78STUVabn中国opwxyz '
select dbo.f_convert(@s1,0),dbo.f_convert(@s1,1)
--*/

CREATE FUNCTION f_Convert(
@str NVARCHAR(4000), --要转换的字符串
@flag bit --转换标志,0转换成半角,1转换成全角
)RETURNS nvarchar(4000)
AS
BEGIN
DECLARE @pat nvarchar(8),@step int,@i int,@spc int
IF @flag=0
SELECT @pat=N '%[!-~]% ',@step=-65248,
@str=REPLACE(@str,N '  ',N ' ')
ELSE
SELECT @pat=N '%[!-~]% ',@step=65248,
@str=REPLACE(@str,N ' ',N '  ')
SET @i=PATINDEX(@pat COLLATE LATIN1_GENERAL_BIN,@str)
WHILE @i> 0
SELECT @str=REPLACE(@str,
SUBSTRING(@str,@i,1),
NCHAR(UNICODE(SUBSTRING(@str,@i,1))+@step))
,@i=PATINDEX(@pat COLLATE LATIN1_GENERAL_BIN,@str)
RETURN(@str)
END
GO

------解决方案--------------------
CREATE FUNCTION dbo.fun_dbc_sbc(@s VARCHAR(800))
/*************************************/
--全半角字母及数字转换-半角转全角
--思路,找出对应unicode区,进行转换转换内容包括0-9:; <=> ?@A-Z[\]^_`a-z
--半角0-9:; <=> ?@A-Z[\]^_`a-z对应48-122
--全角0-9:;<=>?@A-Z[\]^_`a-z对应65296-65370
--tangwf 2007-05-14
/*************************************/
RETURNS VARCHAR(800)
AS
BEGIN
DECLARE @i INT
SET @i=1
WHILE @i <=LEN(@s)
BEGIN
IF UNICODE(SUBSTRING(@s,@i,1)) BETWEEN 48 AND 122
SET @s=STUFF(@s,@i,1,NCHAR(UNICODE(SUBSTRING(@s,@i,1))+65248))
SET @i=@i+1
END
RETURN @s
END
GO
--调用
SELECT dbo.fun_dbc_sbc( '把半角r转换成全角R ') --结果
CREATE FUNCTION dbo.fun_sbc_dbc(@s VARCHAR(800))
/*************************************/
--全角转半角
/*************************************/
RETURNS VARCHAR(800)
AS
BEGIN
DECLARE @i INT
SET @i=1
WHILE @i <=LEN(@s)
BEGIN
IF UNICODE(SUBSTRING(@s,@i,1)) BETWEEN 65296 AND 65370
SET @s=STUFF(@s,@i,1,NCHAR(UNICODE(SUBSTRING(@s,@i,1))-65248))
SET @i=@i+1
END
RETURN @s
END
GO
--调用
SELECT dbo.fun_sbc_dbc( '把半角r转换成全角R ') --结果:把半角r转换成全角R