在SQL Server中为每行生成不同的随机值

在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值都有一个独特的种子,从而生成了不同的随机值。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485