SQL Server中的RAND函數的引見和區間隨機數值函數的完成。本站提示廣大學習愛好者:(SQL Server中的RAND函數的引見和區間隨機數值函數的完成)文章只能為提供參考,不一定能成為您想要的結果。以下是SQL Server中的RAND函數的引見和區間隨機數值函數的完成正文
任務中會碰到SQL Server模仿數據生成和數值列值(如整型、日期和時光數據類型)隨機填充等等義務,這些義務中都要應用到隨機數。鑒於此,本文將對SQL Server中隨機數的應用簡略做個總結 。
T-SQL 隨機有關的三個函數
RAND([seed] 此函數生成從0到1之間隨機 float 值(具體解釋檢查https://technet.microsoft.com/zh-cn/library/ms177610(v=sql.90).aspx)。
CHECKSUM ( * | expression [ ,...n ] ) 此函數生成依照表的某一行或一組表達式盤算出來的int校驗和值,CHECKSUM 用於生成哈希索引(具體解釋檢查https://technet.microsoft.com/zh-cn/library/ms189788(v=sql.90).aspx)。
NEWID ( ) 此函數生成 uniqueidentifier 類型的獨一值(具體解釋檢查https://technet.microsoft.com/zh-cn/library/ms190348(v=sql.90).aspx)。
生成隨意率性一個隨機數值(如整數、日期和時光數據類型)
假如取得隨意率性一個隨機整數值?函數RAND生成的成果是float數據類型的,明顯很難知足請求,不外可以經由過程對函數RAND的成果持續加工(好比其成果乘以某一個值保存整數部門等等)獲得請求。很明顯,函數CHECKSUM生成的成果是int數據類型,很輕易知足我們的成果,不外其參數假如固定(表的某一行值雷同或一組表達式值雷同),那末其成果也是雷同的。函數NEWID可以包管成果的獨一,然則其成果是unigueidentifer數據類型的。
從以上三個函數的成果值剖析:函數RNAD和CHECKSUM的成果是能取得整數數值的。假如我們將函數NEWID的成果值作為函數CHECKSUM的參數,那末其每次生成的成果值都是紛歧樣的int數據類型的數值。以下T-SQL代碼以下:
SELECT CHECKSUM(NEWID()) AS CheckSumValue, CHECKSUM(NEWID()) AS CheckSumValue2; GO
履行後的查詢成果以下:
從下面的查詢成果看到組合生成的整數數值都是9位數的,日常平凡任務中年夜多應用的隨機整數值都是不太年夜的且都是天然數(0和正整數的聚集),這就請求限制隨機生成的整數數值。可使用函數ABS對其成果停止處置獲得隨意率性一個天然數。如許,組合一路來的格局就是如許的:ABS(CHECKSUM(NEWID()))。為了便於應用便於應用我們經由過程將其封裝到函數中,然則函數NEWID又不克不及在函數中應用,那我們就要斟酌其他的方法:將函數NEWID封裝在單列單行的視圖中。其界說視圖的T-SQL代碼以下:
IF OBJECT_ID(N'dbo.vRandomGuid', 'V') IS NOT NULL BEGIN DROP VIEW dbo.vRandomGuid; END GO --================================== -- 功效: 隨機Guid視圖 -- 解釋: 詳細完成論述 -- 作者: XXX -- 創立: yyyy-MM-dd -- 修正: yyyy-MM-dd XXX 修正內容描寫 --================================== CREATE VIEW dbo.vRandomGuid --$Encode$-- AS SELECT RandomGuid = NEWID(); GO 挪用該視圖的T-SQL代碼以下: SELECT TOP RandomGuid FROM dbo.vRandomGuid; GO
履行後的查詢成果以下:
生成整數區間內的隨意率性一個隨機整數
下面的視圖界說,我們持續講授組合函數的進一步封裝。我們先講授若何限制隨機生成的數值,取模運算可以完成生成在指定命值區間內的隨意率性一個數值,例如:獲得區間[3,5]內隨意率性一個數字,我們設為區間的最小值為@intMin:3,最年夜值為@intMax,則該區間的距離值為 @intMax - @intMin + 1: 5 - 3 + 1(3),那末針對隨意率性的整數值設為為@intValue,然後對這個距離值先輩行取模運算在加上區間最小值,最初獲得的值為: @intValue % (@intMax - @intMin + 1) + @intMin。假如@intValue為8,則成果值為5;假如@intValue為9,則成果值為3;假如@intValue為10,則成果值為4……
針對以上的剖析我們封裝的T-SQL代碼以下:
IF OBJECT_ID(N'dbo.ufn_RandNum', 'FN') IS NOT NULL BEGIN DROP FUNCTION dbo.ufn_RandNum; END GO --================================== -- 功效: 獲得區間內的隨意率性一個隨機數值 -- 解釋: 詳細完成論述 -- 作者: XXX -- 創立: yyyy-MM-dd -- 修正: yyyy-MM-dd XXX 修正內容描寫 -- 挪用: SELECT dbo.ufn_RandNum(, ); --================================== CREATE FUNCTION dbo.ufn_RandNum ( @intMin INT, -- 隨機數值的最小值 @intMax INT -- 隨機數值的最年夜值 ) RETURNS INT --$Encode$-- AS BEGIN SET @intMin = ISNULL(@intMin, ); SET @intMax = ISNULL(@intMax, ); DECLARE @guidValue AS UNIQUEIDENTIFIER; SELECT TOP @guidValue = RandomGuid FROM dbo.vRandomGuid; RETURN ABS(CHECKSUM(@guidValue)) % (@intMax - @intMin + ) + @intMin; END GO
挪用以上函數的T-SQL代碼以下:
SELECT dbo.ufn_RandNum(, ) AS RandNum, dbo.ufn_RandNum(, ) AS RandNum; GO
履行後的查詢成果以下:
生成日期區間內的隨意率性一個隨機日期
那末我們持續講授 獲得指定區間內的隨意率性一個隨機日期,不外我們要應用日期和時光的兩個函數:DATEADD和DATEDIFF。應用DATEDIFF盤算出日期區間的距離值,同上的思緒我們盤算獲得的一個隨機整數值,然後經由過程DATEADD獲得我們希冀的一個隨機日期。封裝函數的T-SQL代碼以下:
IF OBJECT_ID(N'dbo.ufn_RandDate', 'FN') IS NOT NULL BEGIN DROP FUNCTION dbo.ufn_RandDate; END GO --================================== -- 功效: 獲得日期區間內的隨意率性一個隨機日期 -- 解釋: 詳細完成論述 -- 作者: XXX -- 創立: yyyy-MM-dd -- 修正: yyyy-MM-dd XXX 修正內容描寫 -- 挪用: SELECT @dtmRand = dbo.ufn_RandDate('--', '--'); --================================== CREATE FUNCTION dbo.ufn_RandDate ( @dtmMin DATETIME, -- 隨機日期的最小值 @dtmMax DATETIME -- 隨機日期的最年夜值 ) RETURNS DATETIME --$Encode$-- AS BEGIN SET @dtmMin = ISNULL(@dtmMin, '--'); SET @dtmMax = ISNULL(@dtmMax, '--'); DECLARE @guidVue AS UNIQUEIDENTIFIER; SELECT TOP @guidVue = RandomGuid FROM dbo.vRandomGuid; -- 可以將HOUR換為DAYS RETURN DATEADD(HOUR, (ABS(CHECKSUM(@guidVue)) % ( + DATEDIFF(HOUR, @dtmMax, @dtmMin))), @dtmMin); END GO
挪用以上函數的T-SQL代碼以下:
SELECT dbo.ufn_RandDate('--', '--') AS RandDate, dbo.ufn_RandDate('--', '--') AS RandDate; GO
履行後的查詢成果以下:
區間隨機數獲得的擴大思慮
不管是獲得數值區間內的隨機數值,照樣日期區間內的隨機日期,我們都應用了視圖vRandomGuid。假如有一個持續的數值序列,我們經由過程查詢這個數值序列,聯合我們的區間數值和隨機排序,也能夠完成以上的後果。
假定該數值序列為SeqDataTable(Num INT),數值區間[@intMin,@intMax],那末該數值區間隨意率性一個隨機數值的T-SQL代碼以下:
SELECT TOP Num FROM dbo.SeqDataTable WHERE Num BETWEEN @intMin AND @intMax ORDER BY NEWID() ASC;
固然也能夠應用以上的數字序列SeqDataTable(Num INT),日期區間[@dtmMin,@dtmMax],誰人該數字區間隨意率性一個隨機日期的T-SQL代碼以下:
SELECT TOP DATEADD(DAY, Num, @dtmMin) FROM dbo.SeqDataTable WHERE Num BETWEEN AND DATEDIFF(DAY, @dtmMax, @dtmMin) ORDER BY NEWID() ASC;
留意:以上代碼沒法履行勝利的,也算是偽代碼的。