mssql sqlserver 快速批量生成不重复随机数的方法分享


摘要:
最近有同事咨询,如何快速的在DB数据库中,生成1000 个随机编码,
需遵循以下要求:
1 随机
2 不重复
3 性能
————————
下文将讲述,根据checksum newId 函数和 数据表 设置主键(避免重复) 快速生成随机数的方案


例:

  /*实验环境: sql server 2008 R2*/ 
 create table A (randInfo char(10) primary key,writeDate datetime default getdate())
go
/*普通生成随机数 start*/

declare @i int 
set @i=1

while @i <= 1000
begin
  
   begin try 
     insert into A(randInfo)values(
     left(
           convert(varchar(max),abs(checksum(newId())))+'00000000000' 
          ,10)
      )    -----生成随机数,从左边截取10位放入临时表中
    set @i =@i+1 
   end try 
   begin catch
   print 'error'
   end catch 

end

  
select * from A 
/*普通生成随机数 end*/
go
truncate table A 
drop     table A  

例:
批量生成随机数的方法,可减少循环的次数,提高生成随机数脚本的性能
借助系统表,减少循环次数,实际情况中我们可以借助任意大表的基础行数,增大每次数据插入次数

  
create table A (randInfo char(10) primary key,writeDate datetime default getdate())
go
/*高效生成随机数 start*/

declare @i int ,@tmp int,@imax int

set @i=1
set @imax = 100000 
while @i <= @imax
begin
   set @tmp =@imax-@i+1
   
   begin try 
   exec  ('
     insert into A(randInfo)     
     select distinct  top  '+@tmp +' 
     left(
           convert(varchar(max),abs(checksum(newId())))+''00000000000'' 
          ,10)
       from sysobjects ')  -----生成随机数,从左边截取10位放入临时表中
        
    set @i =@i+@@rowCount 
    print @i
    print @tmp
   end try 
   begin catch
   ---print 'error'
   end catch 

end

  
select * from A 
/*高效生成随机数 end*/
go
truncate table A 
drop     table A