您的位置:首页 > 数据库

【探讨】寻求去除数据库字段中存放重复内容的最佳方法

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



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

  以下是我的实现全过程:

实现思路为:在数据库端通过函数来处理重复的内容,先将字段内容分割进一个临时表,再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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: