我有两张桌子,每张桌子都包含相应的社会安全号码。我想在保持匹配的同时随机化SSN。
SET @NewSSN = 000000000 + FLOOR((CAST(ABS(CHECKSUM(NEWID())) AS FLOAT) / 2147483648) * (999999999 - 000000000))
我想获取该值并更新两个表,匹配原始SSN。伪代码,我尝试了一些不同的变体:
UPDATE Table1, Table2
SET [Table1].[SocSecNum], [Table2].[SocSecNum] = @NewSSN
WHERE [Table1].[SocSecNum] = [Table2].[SocSecNum]
我可以使用此方法的任何方向吗?
答案 0 :(得分:2)
创建一个交叉引用表,将旧SSN映射到随机值,然后对Table1和Table2执行单独的update
查询以设置新的SSN。
create table #SsnMap (OldSsn <datatype>, NewSsn <datatype>)
insert into #SsnMap (OldSsn)
select SocSecNum
from Table1
union -- distinct!
select SocSecNum
from Table2
update #SsnMap
set NewSsn = [random logic here]
update Table1
set SocSecNum = NewSsn
from #SsnMap
inner join Table1
on SocSecNum = OldSsn
update Table2
set SocSecNum = NewSsn
from #SsnMap
inner join Table2
on SocSecNum = OldSsn
答案 1 :(得分:1)
此外,它假定table2中的所有值都在table1中。而且,如果table1
或table2
具有重复的社会安全号码,则会出现问题。
所以,我建议只使用序号,随机化顺序,组合两个表中的数据,并删除重复项:
select SocSecNum,
right('000000000' + cast(row_number() over (order by newid()) as varchar(255)), 9) as new_SocSecNum
into #SsnMap
from (select SocSecNum
from Table1
union -- on purpose to remove duplicates
select SocSecNum
from Table2
) s;
update t1
set SocSecNum = new_SocSecNum
from Table1 t1 join
#SsnMap s
on t1.SocSecNum = s.SocSecNum;
update t2
set SocSecNum = new_SocSecNum
from Table2 t2 join
#SsnMap s
on t2.SocSecNum = s.SocSecNum;
答案 2 :(得分:0)
只是另一种选择,您可以使用HashBytes()来创建一致的地图。
两个简单的更新,不需要临时地图。
示例强>
Declare @YourTable table (SSN varchar(25))
Insert Into @YourTable values
('555667777'),
('123456789')
Select SSN
,Masked = abs(cast(HashBytes('MD5',SSN) as int))
From @YourTable
<强>结果
SSN Masked
555667777 246591824
123456789 459427083