如何随机产生测试库?
数据表:
学籍号 字符 11位
学期 数字 值(1-12)
科目 数字 值(1-200)
类型 数字 值(1-20)
成绩 数字 浮点数
其中,学籍号、学期、科目、类型组成唯一,随机产生10亿条记录。
这个要怎么实现呢?
问题点数:100、回复次数:20Top
1 楼aw511(点点星灯)回复于 2005-04-04 20:30:12 得分 2
随机数可以用rand()来产生
楼主说的产生那么多的随机记录,关注中...Top
2 楼zjcxc(邹建)回复于 2005-04-04 20:57:41 得分 32
--为生成随机数做准备
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_rand]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_rand]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[v_rand]') and OBJECTPROPERTY(id, N'IsView') = 1)
drop view [dbo].[v_rand]
GO
--需要这样一个视图
create view v_rand as select re=rand()
go
/*----取得指定上下限的随机数
--邹建 2003.12(引用请保留此信息)--*/
/*--调用示例
select dbo.f_rand(10000000000,99999999999),dbo.f_rand(10,100)
--*/
create function f_rand(
@下限 bigint,
@上限 bigint
)
returns float
as
begin
declare @r float
select @r=cast(re*(@上限-@下限)+@下限 as float) from v_rand
return(@r)
end
go
/*===========生成随机数据==================*/
create table 数据表(
学籍号 char(11),
学期 int, --值(1-12)
科目 int, --值(1-200)
类型 int, --值(1-20)
成绩 float,
primary key(学籍号,学期,科目,类型))
go
declare @i bigint
set @i=10000 --要生成的数据条数,根据需要自己改
while @i>0
begin
set rowcount @i
insert 数据表 select
right(replace(newid(),'-',''),11),
dbo.f_rand(1,12),
dbo.f_rand(1,200),
dbo.f_rand(1,20),
dbo.f_rand(1,100)
from sysobjects a,syscolumns b
set @i=@i-@@rowcount
end
set rowcount 0
select count(*) from 数据表
go
drop table 数据表
Top
3 楼gsh945(太平洋底)回复于 2005-04-04 21:03:16 得分 5
rand() 产生的是 0-1之间的数字
1-12 产生的方法 select rand()*12
...
然后用
declare @i numeric
set @i=0
while @i<100000
begin
insert into() values()
set @i=@+1
end
Top
4 楼gsh945(太平洋底)回复于 2005-04-04 21:06:21 得分 2
不过,10亿??????
你的数据库还能运行吗????
Top
5 楼cywarson(阿胜)回复于 2005-04-04 22:15:18 得分 2
学习.Top
6 楼allen_21229(无间道四)回复于 2005-04-04 22:19:52 得分 2
有了邹老大 楼主你就放心吧~~ 呵呵Top
7 楼mybread(马)回复于 2005-04-05 01:23:36 得分 0
如何让学籍号的11位只是由0-9这10个字符组成呢?Top
8 楼zjcxc(邹建)回复于 2005-04-05 09:09:53 得分 5
--为生成随机数做准备
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_rand]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_rand]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[v_rand]') and OBJECTPROPERTY(id, N'IsView') = 1)
drop view [dbo].[v_rand]
GO
--需要这样一个视图
create view v_rand as select re=rand()
go
/*----取得指定上下限的随机数
--邹建 2003.12(引用请保留此信息)--*/
/*--调用示例
select dbo.f_rand(10000000000,99999999999),dbo.f_rand(10,100)
--*/
create function f_rand(
@下限 bigint,
@上限 bigint
)
returns float
as
begin
declare @r float
select @r=cast(re*(@上限-@下限)+@下限 as float) from v_rand
return(@r)
end
go
create function f_rand1()
returns char(11)
as
begin
declare @re varchar(11)
select @re=stuff(re,1,2,'') from v_rand
while len(@re)<10
select @re=@re+stuff(re,1,2,'') from v_rand
return(@re)
end
go
/*===========生成随机数据==================*/
create table 数据表(
学籍号 char(11),
学期 int, --值(1-12)
科目 int, --值(1-200)
类型 int, --值(1-20)
成绩 float,
primary key(学籍号,学期,科目,类型))
go
declare @i bigint
set @i=10000 --要生成的数据条数,根据需要自己改
while @i>0
begin
set rowcount @i
insert 数据表 select
dbo.f_rand1(),
dbo.f_rand(1,12),
dbo.f_rand(1,200),
dbo.f_rand(1,20),
dbo.f_rand(1,100)
from sysobjects a,syscolumns b
set @i=@i-@@rowcount
end
set rowcount 0
select * from 数据表
go
drop table 数据表
drop function f_rand1
Top
9 楼j9988(j9988)回复于 2005-04-05 09:55:39 得分 5
生成10亿数据,不能用WHILE一条条循环.这样一天也完不成.
select count(*) from syscolumns --假设结果为100条(一般会超过100)
100*100*100*100=10亿
所以:
insert into TAb(.....)
select substring(newid(),11) as 学籍号,
cast(rand(chechsum(newid())*12 as int) as 学期,
....
rand(chechsum(newid())*100 as 成绩
from syscolumns A,syscolumns B,syscolumns C,syscolumns D
这样一句完成比较快.(语句没测试,自已做主调整吧.)Top
10 楼j9988(j9988)回复于 2005-04-05 09:57:01 得分 5
上面要加个 top 100000000
insert top 100000000 into TAb(.....)
select substring(newid(),11) as 学籍号,
cast(rand(chechsum(newid())*12 as int) as 学期,
....
rand(chechsum(newid())*100 as 成绩
from syscolumns A,syscolumns B,syscolumns C,syscolumns DTop
11 楼j9988(j9988)回复于 2005-04-05 10:04:49 得分 5
还是错, 应该这样
insert into TAb(.....)
select top 100000000 substring(newid(),11) as 学籍号,
cast(rand(chechsum(newid())*12 as int) as 学期,
....
rand(chechsum(newid())*100 as 成绩
from syscolumns A,syscolumns B,syscolumns C,syscolumnTop
12 楼talantlee(小刀(bluedagger.cn))回复于 2005-04-05 10:11:22 得分 5
select top 100000000000000000 * from 表名 order by newid()
一定能行。。。。。Top
13 楼zjcxc(邹建)回复于 2005-04-05 10:19:22 得分 5
to j9988,实际测试过,如果是一次性生成10亿条数据的话,估计一般的电脑会受不了
所以10亿条应该分几次完成,一次10万条之类
而且他要生成随机数,又要保证主键,所以分批比一次性生成好得多.Top
14 楼j9988(j9988)回复于 2005-04-05 10:24:32 得分 5
10亿条产生的日志和记录至少10至20G.
所以要想运行这10亿.他的机器一般不差.多CPU是正常的.
但不论如何,即使是100条记录,也不会一条条产生吧.
记录随机有个定式,就是: rand(checksum(newid())),这个少不了.Top
15 楼mybread(马)回复于 2005-04-08 17:25:39 得分 0
用前面一中方法产生了2千万多条,速度比较慢。
我想用下面的语句怎么出错了呢?请指正:
insert into xjb(xjh,xq,km,lx,cj)
select top 100 substring(newid(),1,11) as xjh,
cast(rand(checksum(newid())*12) as int) as xq,
cast(rand(checksum(newid())*200) as int) as km,
cast(rand(checksum(newid())*20) as int) as lx,
rand(checksum(newid())*100) as cj,
from syscolumns A,syscolumns B,syscolumns C,syscolumns DTop
16 楼mybread(马)回复于 2005-04-08 17:27:12 得分 0
错误提示:在关键字 'from' 附近有语法错误。
syscolumns在这里做什么呢?Top
17 楼fly_cat_(1)回复于 2005-04-08 17:29:11 得分 5
select top 10*10000*10000 * from table order by newid()Top
18 楼fly_cat_(1)回复于 2005-04-08 17:30:19 得分 5
10*10000*10000是随机的条数,每次都不一样Top
19 楼RamjetZhang(万花从中一点红,玉树临风王小桃是也)回复于 2005-04-08 17:37:28 得分 5
貌似测试也没必要用10亿条数据,10亿条记录就不用SQL Server了;
10亿条比较适合牛机作性能测试用。Top
20 楼j9988(j9988)回复于 2005-04-09 10:16:16 得分 5
用前面一中方法产生了2千万多条,速度比较慢。
我想用下面的语句怎么出错了呢?请指正:
insert into xjb(xjh,xq,km,lx,cj)
select top 100 substring(newid(),1,11) as xjh,
cast(rand(checksum(newid())*12) as int) as xq,
cast(rand(checksum(newid())*200) as int) as km,
cast(rand(checksum(newid())*20) as int) as lx,
rand(checksum(newid())*100) as cj,--------------这儿多个","!
from syscolumns A,syscolumns B,syscolumns C,syscolumns D
Top




