Beyond the dream——飛雪飄寒

————磨難不過是人生鍵盤的回車。。。。。。
  博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

  最近项目中出现了一个BUG,找了很久才找到原因,是由于以前的“脏”数据造成的,具体“脏”数据类似下图所示:
   

    以上图中有些行存放了重复的内容,如901339013390079007190072900739007490075900769007中出现了重复的901339007,正确的存放应该是901339007900719007290073900749007590076。问题已经说明,现在需要做的就是解决问题了,如何得到正确的数据以及要求必须在数据库端来处理重复内容呢?如果哪位博友有更简捷的解决方法,欢迎提出指点。  

  以下是我的实现全过程:

实现思路为:在数据库端通过函数来处理重复的内容,先将字段内容分割进一个临时表,再select出不重复的内容,然后把select出的每一条记录内容组合成新的字符串,最后update该字段;
    1、创建分割函数(将字段中的内容进行分割进一个临时表)

create    Function [dbo].[split](@Sql varchar(8000),@Splits varchar(10))

returns @temp Table (a varchar(100))

As

Begin

       Declare @i Int

       Set @Sql = RTrim(LTrim(@Sql))

       Set @i = CharIndex(@Splits,@Sql)

       While @i >= 1

       Begin

              Insert @temp Values(Left(@Sql,@i-1))

              Set @Sql = SubString(@Sql,@i+1,Len(@Sql)-@i)

              Set @i = CharIndex(@Splits,@Sql)

       End

      

       If @Sql <> ''

              Insert @temp Values (@Sql)

       Return

End

2、创建组合字段新内容的函数(将临时表中select出的不重复的内容组合成一个新字符串) 

CREATE FUNCTION [dbo].[Convert_ManageDeptCodes]

(

 @ManageDeptCodes varchar(Max)

)

returns varchar(Max)

as

begin

       declare @ConvertManageDeptCodes varchar(Max),@length int

       set @ConvertManageDeptCodes ='';

       set @length=0;

       select

       @ConvertManageDeptCodes = @ConvertManageDeptCodes+data+','

       from

       (

       SELECT distinct a as Data from dbo.Split(@ManageDeptCodes,',')

       )T

       if(len(@ConvertManageDeptCodes)>0)

       set @length=len(@ConvertManageDeptCodes)-1;

       set @ConvertManageDeptCodes=Left(@ConvertManageDeptCodes,@length);

       return @ConvertManageDeptCodes;

end

3、更新该字段的内容

update userinfo set ManageDeptCodes=dbo.Convert_ManageDeptCodes(ManageDeptCodes)