位置:首页 > 数据库 > SQL Server
Sql server 生成随机数据的简单示例
日期:2023-01-03 人气:

大家好,对Sqlserver 生成随机数据的简单示例感兴趣的小伙伴,下面一起跟随三零脚本的小编来看看Sqlserver 生成随机数据的简单示例的例子吧。

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

---- 来自www.q3060.com 
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  

 

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

---- 来自www.q3060.com 
--生成一段时间内的随机时间
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) 

 

三、随机生成中文名字

---- 来自www.q3060.com 
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 名字

 

四、生成随机手机号

---- 来自www.q3060.com 
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、

---- 来自www.q3060.com 
select  floor(rand()*N)  ---生成的数是这样的:12.0

select cast( floor(rand()*N) as int)  ---生成的数是这样的:12
2、
---- 来自www.q3060.com 

select ceiling(rand() * N)  ---生成的数是这样的:12.0
 
select cast(ceiling(rand() * N) as int)  ---生成的数是这样的:12
其中里面的N是一个你指定的整数,如100,可以看出,两种方法的A方法是带有.0这个的小数的,而B方法就是真正的整数了。 大致一看,这两种方法没什么区别,真的没区别?其实是有一点的,那就是他们的生成随机数的范围: 方法1的数字范围:0至N-1之间,如
---- 来自www.q3060.com 
cast( floor(rand()*100) as int)

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

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

---- 来自www.q3060.com 
cast(ceiling(rand() * 100) as int)

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

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

比较 CEILING 和 FLOOR

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

另外,还要提示一下各位菜鸟,关于随机取得表中任意N条记录的方法,很简单,就用newid():
---- 来自www.q3060.com 
select top N *  from table_name order by newid() ----N是一个你指定的整数,表是取得记录的条数