创建函数或sproc以用伪随机数据替换实际数据

时间:2016-02-17 02:05:43

标签: sql .net sql-server sql-server-2008 tsql

我需要从可归类为PHI的表中清除数据。

假设真实数据如下:

+-------------------+-----------+------+
|       Name        | Condition | Code |
+-------------------+-----------+------+
| Alex              | A         |   12 |
| Laura             | BB        |   32 |
| Bob               | AAA       |   55 |
| Gary              | C         |   32 |
+-------------------+-----------+------+

我需要使用以下假名替换名称列:

Names_Reference_Table:

+-------------+----+
|    Name     | ID |
+-------------+----+
| JOHN        |  1 |
| ROBERT      |  2 |
| MICHAEL     |  3 |
| WILLIAM     |  4 |
| DAVID       |  5 |
| RICHARD     |  6 |
| CHARLES     |  7 |
| JOSEPH      |  8 |
| THOMAS      |  9 |
| CHRISTOPHER | 10 |
| DANIEL      | 11 |
| PAUL        | 12 |
| MARK        | 13 |
| DONALD      | 14 |
| GEORGE      | 15 |
+-------------+----+

虽然我有10,000,000个真实数据记录,但我只有10,000个假数据记录。我假设在替换真实数据时,每个假名称将重复1000次。

这里的诀窍是,这需要可再加工。谷歌搜索了几个小时后,我确实找到了一些很好的资源,并且我已经创建了某种确定性的实现,假设种子没有改变:

SELECT FLOOR(RAND(@seed * LOG([p].[patientid]) * 1000) * ( @count_names - 1 ) + 1)

从上面可以看出,当您将相同的种子传递给RAND()时,它将返回相同的值。但是,这种实现很脆弱。

是否有人就如何产生这种确定性行为提供指导?

2 个答案:

答案 0 :(得分:1)

您可以使用校验和或其他一些散列函数,例如

SELECT Name 
FROM Names_Reference_Table
WHERE ID = ABS(CHECKSUM('John')) % 10000

假设您有10,000个假名

答案 1 :(得分:1)

如果我理解正确,实际名称不仅仅是虚拟名称。因此,您希望通过对实名重复虚拟名称1000来将实际名称替换为虚拟名称。这可以通过使用Ntile函数来实现,如下所示 -

declare @i int = (select max(id) from reference_table)
select b.name,a.condition,a.code from
(
select name,condition,code, Ntile(@i) over (order by code) as RefId
from actualTable
) as a
Left join Refrence_table as b
on b.id = a.refid

如果有帮助,请告诉我