在Sqlserver中生成随机数据

百度了各种随机生成,集中摘录如下:

一、循环写入千万级测试数据

DECLARE @i int  
SET @i = 1  
WHILE (@i <=10000000)  
BEGIN  
INSERT INTO A_User(username,password,addtime,token,roleid)  
VALUES('manage6'+CONVERT( CHAR(12), cast(ceiling(rand() * @i*10) as int) ),CONVERT( CHAR(12), cast(ceiling(rand() * @i) as int) ),'2016-11-08 05:01:40',CONVERT( CHAR(14), cast(ceiling(rand() * @i*100) as int) ),cast(ceiling(rand() * 6) as int))  
SET @i = @i + 1  
END  
GO  

二、生成一段时间内的随机时间

--生成一段时间内的随机时间
declare @Date_start datetime 
declare @Date_end datetime 
set @Date_start= '2018-06-01' 
set @Date_end=getdate() 
select 时间=dateadd(minute,abs(checksum(newid()))%(datediff(minute,@Date_start,@Date_end)+1),@Date_start) 

三、随机生成中文名字

DECLARE @fName TABLE(Id INT IDENTITY(1,1) PRIMARY KEY, NAME NVARCHAR(20))    -- 姓氏
DECLARE @lName TABLE(Id INT IDENTITY(1,1) PRIMARY KEY, NAME NVARCHAR(20))    -- 名字

INSERT @fName VALUES
(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),
(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),
(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),
(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),
(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),
(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),
(''),(''),(''),('')

INSERT @lName VALUES (''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),
(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),
(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),
('殿'),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),
(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),
(''),(''),(''),(''),(''),(''),(''),(''),('广'),(''),(''),(''),(''),(''),
(''),(''),(''),(''),(''),(''),(''),('鸿'),(''),(''),(''),(''),(''),(''),
(''),(''),(''),(''),('')

-- 生成名字
SELECT RTRIM((SELECT NAME FROM @fName WHERE Id = Round(Rand()*(100-1)+1,0)))
+RTRIM(LTRIM((SELECT NAME FROM @lName WHERE Id = Round(Rand()*(100-1)+1,0))))
+RTRIM(LTRIM((SELECT NAME FROM @lName WHERE Id = Round(Rand()*(100-1)+1,0)))) AS 名字

四、生成随机手机号

IF EXISTS(SELECT * FROM sysobjects WHERE name='proc_PhoneNum')
    DROP PROCEDURE proc_PhoneNum
GO
CREATE PROCEDURE proc_PhoneNum
    @randCardID varchar(19) OUTPUT,      --输出参数
    @firstNo varchar(4)='132 '   --输入参数,有默认值
    AS
        DECLARE @r numeric(15,8)   --15位数,保留8位小数
        DECLARE @tempStr char(10)

        select @r=RAND((DATEPART(mm,GETDATE())*100000)+(DATEPART(ss,GETDATE())*1000)+DATEPART(ms,GETDATE()))
        SET @tempStr=@r
        SET @randCardID=@firstNo+SUBSTRING(@tempStr,3,4)+' '+SUBSTRING(@tempStr,7,4)
GO
--测试
DECLARE @phoneNum nvarchar(20)
EXECUTE proc_PhoneNum @phoneNum OUTPUT
print '产生的随机手机号为:'+@phoneNum
--insert phones values(@phoneNum)

五、生成一定范围的随机数

在查询分析器中执行:select rand(),可以看到结果会是类似于这样的随机小数:0.36361513486289558,像这样的小数在实际应用中用得不多,一般要取随机数都会取随机整数。那就看下面的两种随机取整数的方法:
1、

select  floor(rand()*N)  ---生成的数是这样的:12.0
select cast( floor(rand()*N) as int)  ---生成的数是这样的:12

2、

select ceiling(rand() * N)  ---生成的数是这样的:12.0
select cast(ceiling(rand() * N) as int)  ---生成的数是这样的:12

其中里面的N是一个你指定的整数,如100,可以看出,两种方法的A方法是带有.0这个的小数的,而B方法就是真正的整数了。
大致一看,这两种方法没什么区别,真的没区别?其实是有一点的,那就是他们的生成随机数的范围:
方法1的数字范围:0至N-1之间,如

cast( floor(rand()*100) as int)

就会生成0至99之间任一整数

方法2的数字范围:1至N之间,如

cast(ceiling(rand() * 100) as int)

就会生成1至100之间任一整数

对于这个区别,看SQL的联机帮助就知了:

 

比较 CEILING 和 FLOOR

 

CEILING 函数返回大于或等于所给数字表达式的最小整数。FLOOR 函数返回小于或等于所给数字表达式的最大整数。例如,对于数字表达式 12.9273,CEILING 将返回 13,FLOOR 将返回 12。FLOOR 和 CEILING 返回值的数据类型都与输入的数字表达式的数据类型相同。
----------------------------------------------------------------------------------
现在,各位就可以根据自己需要使用这两种方法来取得随机数了^_^

 

另外,还要提示一下各位菜鸟,关于随机取得表中任意N条记录的方法,很简单,就用newid():

select top N *  from table_name order by newid() ----N是一个你指定的整数,表是取得记录的条数

 

 

 

posted on 2018-06-19 17:42  静以修身俭以养德  阅读(3236)  评论(0编辑  收藏  举报

导航