最近项目中出现了一个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)