我不清楚,你的半个汉字是怎么来的,但是,你可以通过如下的方法修正过来。
--去除半个汉字
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

解决方案 »

  1.   

    我的SQL Server字符集是中文的,但我猜想,英文也没有问题。
    测试如下
    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的函数。
      

  2.   

    如果用在查询中,做成函数
    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) 去掉半个汉字