我不清楚,你的半个汉字是怎么来的,但是,你可以通过如下的方法修正过来。
--去除半个汉字
create procedure sp_TruncSemiHanzi(@str varchar(4000),@@str2 varchar(8000) OUTPUT)
as
begin
declare
@sTmp varchar(8000),@i int,@itmp int,@itmp2 int ,@stmp2 varchar(2)
select @sTmp=''
select @i=1
while @i<=len(@str)
begin
select @itmp=convert(int,substring(convert(varbinary,substring(@str ,@i,1)),1,1))
if @itmp>127
begin
select @itmp2=convert(int,substring(convert(varbinary,substring(@str ,@i,1)),2,1))
if @itmp2>127
begin
select @stmp2=char(@itmp)+char(@itmp2) --是一个完整的汉字
end
else
begin
select @stmp2=char(@itmp2) --丢弃半个汉字
end
end
else
begin
select @sTmp2=char(@itmp)
end
select @sTmp=@sTmp+@stmp2
select @i=@i+1
end
select @@str2=@stmp
end
--去除半个汉字
create procedure sp_TruncSemiHanzi(@str varchar(4000),@@str2 varchar(8000) OUTPUT)
as
begin
declare
@sTmp varchar(8000),@i int,@itmp int,@itmp2 int ,@stmp2 varchar(2)
select @sTmp=''
select @i=1
while @i<=len(@str)
begin
select @itmp=convert(int,substring(convert(varbinary,substring(@str ,@i,1)),1,1))
if @itmp>127
begin
select @itmp2=convert(int,substring(convert(varbinary,substring(@str ,@i,1)),2,1))
if @itmp2>127
begin
select @stmp2=char(@itmp)+char(@itmp2) --是一个完整的汉字
end
else
begin
select @stmp2=char(@itmp2) --丢弃半个汉字
end
end
else
begin
select @sTmp2=char(@itmp)
end
select @sTmp=@sTmp+@stmp2
select @i=@i+1
end
select @@str2=@stmp
end
测试如下
DECLARE @RC int
DECLARE @str varchar(4000)
DECLARE @@str2 varchar(8000)
-- 设置参数值
--带有半个汉字,是你这个汉字的前面一部分
select @str='b'+char(convert(int,substring(convert(varbinary,'你'),1,1)))+'a你'
EXEC @RC = [test].[dbo].[sp_TruncSemiHanzi] @str, @@str2 OUTPUT select @str,len(@str),@@str2,len(@@str2)带有半个汉字 长度 去掉半个汉字 长度
------------- ----------- --------------- --------
b腶你 3 ba你 3(所影响的行数为 1 行)总结
1 如果是存放在varchar中,1个汉字由2个字节组成,1个英文由1个字节组成。汉字的两个字节都是>127的。
2 要通过截取字节来比较,判断。SQL Server竟然没有提供substrb,lenb这样的函数,不能说是有点遗憾,反正可以convert成varbinary来作,substring(varbinary)是按字节截的。建议SQL Server后续版本应该提供substringb和lenb的函数。
create function fn_TruncSemiHanzi(@str varchar(4000))
returns varchar(8000)
as
begin
declare
@sTmp varchar(8000),@i int,@itmp int,@itmp2 int ,@stmp2 varchar(2)
select @sTmp=''
select @i=1
while @i<=len(@str)
begin
select @itmp=convert(int,substring(convert(varbinary,substring(@str ,@i,1)),1,1))
if @itmp>127
begin
select @itmp2=convert(int,substring(convert(varbinary,substring(@str ,@i,1)),2,1))
if @itmp2>127
begin
select @stmp2=char(@itmp)+char(@itmp2) --是一个完整的汉字
end
else
begin
select @stmp2=char(@itmp2) --丢弃半个汉字
end
end
else
begin
select @sTmp2=char(@itmp)
end
select @sTmp=@sTmp+@stmp2
select @i=@i+1
end
return @stmp
endDECLARE @str varchar(4000)
-- 设置参数值
select @str='b'+char(convert(int,substring(convert(varbinary,'你'),1,1)))+'a你'
select @str 带有半个汉字,dbo.fn_TruncSemiHanzi(@str) 去掉半个汉字