CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  应用实例

如何随机产生测试库?

楼主mybread(马)2005-04-04 20:21:44 在 MS-SQL Server / 应用实例 提问

数据表:  
  学籍号     字符     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

相关问题

  • 急!如何随机产生测试数据库呢?
  • 随机产生color
  • 请问如何产生随机入库单编号?
  • 请问如何产生随机入库单编号?
  • 如何产生随机数?
  • 如何产生随机数???
  • 产生随机时间!
  • 随机产生字符串?
  • 怎样产生随机数?
  • 怎么产生随机数?

关键词

  • 学期
  • 语句
  • 科目
  • 数字
  • 数据
  • rand
  • newid
  • syscolumns
  • 数据表
  • chechsum

得分解答快速导航

  • 帖主:mybread
  • aw511
  • zjcxc
  • gsh945
  • gsh945
  • cywarson
  • allen_21229
  • zjcxc
  • j9988
  • j9988
  • j9988
  • talantlee
  • zjcxc
  • j9988
  • fly_cat_
  • fly_cat_
  • RamjetZhang
  • j9988

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo