SQLServer使用Checksum结合NewID获得随机数

前面的帖子有介绍过rand获取随机数的方法,因为rand本身有一个无法避免的尴尬的问题,所以需要引入checksum结合newid的方法来获取随机数!在此之前,先简单了解一下checksum吧!
       Checksum:总和检验码,校验和。在数据处理和数据通信领域中,用于校验目的的一组 数据项的和。这些数据项可以是数字或在计算检验总和过程中看作数字的其它字符串。它通常是以十六进制为数制表示的形式, 如果校验和的数值超过十六进制的FF,也就是255. 就要求其补码作为校验和.通常用来在通信中,尤其是远距离通信中保证数据的完整性和准确性.——百度百科
       在SQLServer中Checksum()需要传入1个参数,可以是任何类型,如下示例:
SELECT CHECKSUM(1)			--1
SELECT CHECKSUM('A')		--114
SELECT CHECKSUM('AA')		--34472462
SELECT CHECKSUM(GETDATE())	--18516390
可以看出,传入不同参数就有不同的返回值,每个参数的返回值都是固定的,而且还有可能会出现负数的,几乎看不出有什么规律~
因此,我们可以通过传入newid()来获得随机数,因为newid()每次获得的值都是唯一的随机的。
下面来验证一下:
我们稍加处理,就可以当作rand来使用了,而且还避免了在某些情景下rand获得一堆重复的随机数的尴尬局面:
在这里和rand放在一起做比较,看起来获得的随机数结果并无太大区别哈~

下面有一张临时表,只有id一个字段,我用checksum和rand两种方法分别给每个id附上一个随机数:
看出问题所在了吧!rand获得的随机数都是一样的,而checksum结合newid的方法获得的随机数才是我们想要的!

下面延伸一个方法,供将来有需要获得随机数的时候使用!新建一个标量值函数,通过传入参数最大值、最小值、保留几位小数、以及newid()来获得随机数:
Create FUNCTION Scalar_CheckSumNEWID
(
	@From int,
	@To int,
	@Keep int,
	@newid varchar(50)
)
RETURNS float
BEGIN
	DECLARE @ResultVar float
	SELECT @ResultVar=CONVERT(BIGINT,RIGHT(ABS(CHECKSUM(@newid)),9))*0.1/100000000
	RETURN @From+round((@To-@From)*@ResultVar,@Keep)
END
GO
注:newid之所以要放在传入参数中,是因为想newid和rand之类的不能放在函数的本身执行,只能通过传入参数带入
 

 

猜你喜欢

转载自blog.csdn.net/Wikey_Zhang/article/details/77000001