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


    2009-01-20 14:36

    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

  • 相关阅读:
    HDU 1556 差分,前缀和
    Full permutation
    PAT B1029
    字串简介
    阵列(3)
    完形填空
    关于c的比较
    19 阵列的复制
    switch述句
    阵列变数(2)
  • 原文地址:https://www.cnblogs.com/zhangsir/p/1661402.html
Copyright © 2020-2023  润新知