本文将对SQL金沙js娱乐场官方网站:

这些任务中都要使用到随机数,Server中随机数的使用简单做个总结 ,seed

金沙js娱乐场官方网站 6

    工作中会遇到SQL
Server模拟数据生成以及数值列值(如整型、日期和时间数据类型)随机填充等等任务,这些任务中都要使用到随机数。鉴于此,本文将对SQL
Server中随机数的使用简单做个总结 。
 
T-SQL 随机有关的三个函数
    
   
RAND([seed] 
此函数生成从0到1之间随机 float 值(详细说明查看
 

这一篇我们来捋捋在T-SQL中可能会用到的几个特殊的函数

    CHECKSUM ( * | expression [ ,…n ]
此函数生成按照表的某一行或一组表达式计算出来的int校验和值,CHECKSUM
用于生成哈希索引(详细说明查看

  1. 随机数: RAND

    
    NEWID (
此函数生成 uniqueidentifier 类型的唯一值(详细说明查看
 
生成任意一个随机数值(如整数、日期和时间数据类型)
 
 
  
如果获得任意一个随机整数值?函数RAND生成的结果是float数据类型的,显然很难满足要求,不过可以通过对函数RAND的结果继续加工(比如其结果乘以某一个值保留整数部分等等)得到要求。很显然,函数CHECKSUM生成的结果是int数据类型,很容易满足我们的结果,不过其参数如果固定(表的某一行值相同或一组表达式值相同),那么其结果也是相同的。函数NEWID可以保证结果的唯一,但是其结果是unigueidentifer数据类型的。
 
   
从以上三个函数的结果值分析:函数RNAD和CHECKSUM的结果是能获得整数数值的。如果我们将函数NEWID的结果值作为函数CHECKSUM的参数,那么其每次生成的结果值都是不一样的int数据类型的数值。以下T-SQL代码如下:
SELECT CHECKSUM(NEWID()) AS CheckSumValue, CHECKSUM(NEWID()) AS CheckSumValue2;
GO执行后的查询结果如下:
金沙js娱乐场官方网站 1
 金沙js娱乐场官方网站 2
   
从上面的查询结果看到组合生成的整数数值都是9位数的,平时工作中大多使用的随机整数值都是不太大的且都是自然数(0和正整数的集合),这就要求限制随机生成的整数数值。可以使用函数ABS对其结果进行处理得到任意一个自然数。这样,组合一起来的格式就是这样的:ABS(CHECKSUM(NEWID()))。为了便于使用便于使用我们通过将其封装到函数中,但是函数NEWID又不能在函数中使用,那我们就要考虑其他的方式:将函数NEWID封装在单列单行的视图中。其定义视图的T-SQL代码如下:

返回从 0 到 1 之间的随机 float 值。

 1 IF OBJECT_ID(N'dbo.vRandomGuid', 'V') IS NOT NULL 2 BEGIN 3   DROP VIEW dbo.vRandomGuid; 4 END 5 GO 6  7 --================================== 8 -- 功能: 随机Guid视图 9 -- 说明: 具体实现阐述 10 -- 作者: XXX11 -- 创建: yyyy-MM-dd12 -- 修改: yyyy-MM-dd XXX 修改内容描述13 --==================================14 CREATE VIEW dbo.vRandomGuid15   --$Encode$--16 AS17   SELECT RandomGuid = NEWID();18 GO19 20 调用该视图的T-SQL代码如下:21 SELECT TOP 1 RandomGuid22 FROM dbo.vRandomGuid;23 GO
语法: RAND ( [ seed ] )

 

seed
提供种子值的整数表达式(tinyintsmallint
int)。如果未指定 seed,则 Microsoft SQL Server 数据库引擎
随机分配种子值。对于指定的种子值,返回的结果始终相同。

执行后的查询结果如下:

随机数是我们经常会用到的,几乎所有的语言都支持产生随机数。而且函数都差不多。例如在VBA和VB中也是用RAND,在C#中用RANDOM等等

金沙js娱乐场官方网站 3
金沙js娱乐场官方网站 4
        
生成整数区间内的任意一个随机整数
    
 
  
上面的视图定义,我们继续讲解组合函数的进一步封装。我们先讲解如何限制随机生成的数值,取模运算可以实现生成在指定数值区间内的任意一个数值,例如:获取区间[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代码如下:

【注意】我相信很多朋友都对于彩票那些数字很感兴趣.其实说白了,那是一个随机数(如果电脑开票的话).
那么,如果我们能猜到那个seed,就能模拟出来想要的号码。这不是天方夜谭,我曾经听说台湾就曾经有人这么做过,而且每期必中。后来据说被逮起来了,说是有内幕交易,其实人家冤枉啊。早期的彩票比较粗糙,确实可能才出来的。

 1 IF OBJECT_ID(N'dbo.ufn_RandNum', 'FN') IS NOT NULL 2 BEGIN 3   DROP FUNCTION dbo.ufn_RandNum; 4 END 5 GO 6  7 --================================== 8 -- 功能: 获取区间内的任意一个随机数值 9 -- 说明: 具体实现阐述 10 -- 作者: XXX11 -- 创建: yyyy-MM-dd12 -- 修改: yyyy-MM-dd XXX 修改内容描述13 -- 调用: SELECT dbo.ufn_RandNum(0, 1);14 --==================================15 CREATE FUNCTION dbo.ufn_RandNum16 (17   @intMin INT,      -- 随机数值的最小值18   @intMax INT        -- 随机数值的最大值19 ) RETURNS INT20   --$Encode$--21 AS22 BEGIN  23   SET @intMin = ISNULL(@intMin, 0);24   SET @intMax = ISNULL(@intMax, 0);25 26   DECLARE @guidValue AS UNIQUEIDENTIFIER;27 28   SELECT TOP 1 @guidValue = RandomGuid29   FROM dbo.vRandomGuid;30 31   RETURN ABS(CHECKSUM(@guidValue)) % (@intMax - @intMin + 1) + @intMin;32 END33 GO

 

 

  1. 校验和值:CHECKSUM

调用以上函数的T-SQL代码如下:

返回按照表的某一行或一组表达式计算出来的校验和值。CHECKSUM
用于生成哈希索引。

1 SELECT dbo.ufn_RandNum(0, 1) AS RandNum, dbo.ufn_RandNum(10, 11) AS RandNum2;2 GO
语法:CHECKSUM ( * | expression [ ,...n ] )

 

*
指定对表的所有列进行计算。如果有任一列是非可比数据类型,则 CHECKSUM
返回错误。非可比数据类型有 text、ntext、image、XML 和
cursor,还包括以上述任一类型作为基类型的 sql_variant。

执行后的查询结果如下:
金沙js娱乐场官方网站 5
金沙js娱乐场官方网站 6
 
生成日期区间内的任意一个随机日期
 
    那么我们继续讲解
获取指定区间内的任意一个随机日期,不过我们要使用日期和时间的两个函数:DATEADD和DATEDIFF。使用DATEDIFF计算出日期区间的间隔值,同上的思路我们计算得到的一个随机整数值,然后通过DATEADD得到我们期望的一个随机日期。封装函数的T-SQL代码如下:

expression
除非可比数据类型之外的任何类型的表达式。

 1 IF OBJECT_ID(N'dbo.ufn_RandDate', 'FN') IS NOT NULL 2 BEGIN 3   DROP FUNCTION dbo.ufn_RandDate; 4 END 5 GO 6  7 --================================== 8 -- 功能: 获取日期区间内的任意一个随机日期 9 -- 说明: 具体实现阐述 10 -- 作者: XXX11 -- 创建: yyyy-MM-dd12 -- 修改: yyyy-MM-dd XXX 修改内容描述13 -- 调用: SELECT @dtmRand = dbo.ufn_RandDate('2007-02-01', '2007-03-01');14 --==================================15 CREATE FUNCTION dbo.ufn_RandDate 16 (17   @dtmMin DATETIME,  -- 随机日期的最小值18   @dtmMax DATETIME  -- 随机日期的最大值19 ) RETURNS DATETIME20   --$Encode$--21 AS22 BEGIN23   SET @dtmMin = ISNULL(@dtmMin, '2000-01-01');24   SET @dtmMax = ISNULL(@dtmMax, '2000-01-01');25   DECLARE @guidVue AS UNIQUEIDENTIFIER;26 27   SELECT TOP 1 @guidVue = RandomGuid 28   FROM dbo.vRandomGuid;29 30   -- 可以将HOUR换为DAYS31   RETURN DATEADD(HOUR, (ABS(CHECKSUM(@guidVue)) % (1 + DATEDIFF(HOUR, @dtmMax, @dtmMin))), @dtmMin);32 END33 GO

返回值是int

 

CHECKSUM
对其参数列表计算一个称为校验和的哈希值。此哈希值用于生成哈希索引。如果
CHECKSUM 的参数为列,并且对计算的 CHECKSUM
值生成索引,则结果是一个哈希索引。它可用于对列进行等价搜索。