100万个不重复的8位的随机数

 

代码
USE  tempdb

GO


--  创建测试表

CREATE   TABLE  tb(id  char ( 8 ))


--  创建用于自动过滤重复值的唯一索引

CREATE   UNIQUE   INDEX  IX_tb  ON  tb(id)

WITH  IGNORE_DUP_KEY 

GO


--  测试数据插入的处理时间, 记录开始处理的时间点

DECLARE   @dt   datetime

SET   @dt   =   GETDATE ()


--  插入随机数据

SET  NOCOUNT  ON

DECLARE   @row   int

SET   @row   =   1000000   --  设置总记录数

WHILE   @row   > 0

BEGIN

    
--  显示提示信息, 表示还需要插入多行数据

    
RAISERROR ( ' need %d rows ' 10 1 @row WITH  NOWAIT


    
--  插入随机的位编码数据

    
SET   ROWCOUNT   @row

    
INSERT  tb  SELECT

        id 
=   RIGHT ( 100000000   +   CONVERT ( bigint ABS (CHECKSUM( NEWID ()))),  8 )

    
FROM  syscolumns c1, syscolumns c2

    
SET   @row   =   @row   -   @@ROWCOUNT

END


--  显示插入数据使用的时间

SELECT  BeginDate  =   @dt , EndDate  =   GETDATE (), 

    Second 
=   DATEDIFF (Second,  @dt GETDATE ()),

GO


--  显示最终的结果记录是否正确

SELECT   COUNT ( * FROM  tb

GO


--  删除测试

DROP   TABLE  tb
 

 

 

DECLARE @dt datetime
SET @dt = GETDATE()
SET NOCOUNT ON --不返回影响的行数,可以提高效率
DECLARE @row int
SET @row = 1000000
WHILE @row >0
BEGIN
RAISERROR('need %d rows', 10, 1, @row) WITH NOWAIT --有重复行发生的时候把信息输出到客户端
SET ROWCOUNT @row --select ... FROM syscolumns c1, syscolumns c2的行数会超过100W,这里只取100W
INSERT Testtb(code) SELECT ---一次性的插入100W条记录,如果有重复的记录,那需要第二次执行插入,以此类推,一直到插入100W条为止。
id = 'ABCD' + RIGHT(100000000 + CONVERT(bigint, ABS(CHECKSUM(NEWID()))), 8)--100000000用来确保生成的随机数字有8位长度,
FROM syscolumns c1, syscolumns c2 --这里使用syscolumns只是为了获得大于100W的记录而已。至于随机的来源是个这个表是没有关系的。
SET @row = @row - @@ROWCOUNT --根据影响的行数,设置循环的时候需要插入的记录数量,这个记录数量等于本次操作中重复的记录的行数。
END
SELECT BeginDate = @dt, EndDate = GETDATE(), Second = DATEDIFF(Second, @dt, GETDATE())
GO

SELECT COUNT(*) FROM Testtb
GO

/*我的问题是
(1)为什么使用CHECKSUM()来生成随机数字?
(2)NEWID是生成一个唯一标志,既然它是唯一性的,怎么会又有重复的呢?
(3)http://msdn2.microsoft.com/zh-cn/library/ms189788.aspx
返回按照表的某一行或一组表达式计算出来的校验和值。CHECKSUM 用于生成哈希索引。
哈希表索引是数字型的吗?
*/   
    

RAISERROR('need %d rows', 10, 1, @row) WITH NOWAIT --有重复行发生的时候把信息输出到客户端
-- 这个是直接给提示信息, 有重复时的提示信息是sql自动抛出的


INSERT Testtb(code) SELECT ---一次性的插入100W条记录,如果有重复的记录,那需要第二次执行插入,以此类推,一直到插入100W条为止。

-- 有重复的数据的时候, 重复的数据会自动过滤掉  

 

CHECKSUM
返回在表的行上或在表达式列表上计算的校验值。CHECKSUM 用于生成哈希索引。

语法
CHECKSUM ( * | expression [ ,...n ] )

参数
*

指定在表的所有列上进行计算。如果有任一列是非可比数据类型,则 CHECKSUM 返回错误。不可比数据类型是 text、ntext、image、cursor 以及基本类型为前 4 个数据类型之一的 sql_variant。

expression

是除非可比数据类型之外的任何类型的表达式。

返回类型
int


000

 

你可能感兴趣的:(随机数)