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之類的不能放在函數的本身執行,只能通過傳入參數帶入
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章