在SQL Server中,为每行生成不同的随机值并不像看起来那么简单。如果尝试使用一个随机值来更新,比如这样:
update MyTable set SomeValue = rand()
那么每一行最终都会得到相同的“随机”值。这是因为SQL Server只运行一次rand()
函数,因为它不依赖于行中的任何值。
接下来的想法是将rand()
函数与每行的一个值结合起来。例如:
update MyTable set SomeValue = rand(Id)
其中Id是一个整型列。但结果并不像希望的那样随机。因为Id列是一个自增列,所以“随机”数字几乎是连续的。例如,对于以下Id值,得到了以下“随机”数字:
Id | Rand(Id) |
---|---|
101 | 0.715436657367485 |
102 | 0.715455290338744 |
103 | 0.715473923310002 |
104 | 0.715473923310002 |
因此,需要找到一种方法,使得每行的种子值都不同。所以决定使用Id列的MD5哈希值。例如:
update MyTable set SomeValue = rand(HASHBYTES('md5', convert(varchar, Id)))
这将产生以下值:
Id | Rand(HASHBYTES('md5', convert(varchar, Id))) |
---|---|
101 | 0.954016112182829 |
102 | 0.249482833129777 |
103 | 0.863832691946289 |
104 | 0.751055796147016 |
这种方法为需求提供了足够的随机性。通过使用MD5哈希,确保了每个Id值都有一个独特的种子,从而生成了不同的随机值。