n是一个变量,表中有一列是1-n之间的数字,其余列在插入时已经确定。假如n为4,则在指定表中插入的行如下key  number
a    1
a    2
a    3
a    4其中a是一个变量,每次插入可能不同,也就是说,以后还可能插入key=b,number=1-n的行。之前采用一个办法,就是事先有一个只有1列的表,那个表的唯一字段就是从1到一个较大的数字。
插入时采用select top n 的方法。但如果n的变化范围比较大,这种方法就不能确保了,有没有什么好办法?我目前能想到的办法就是用循环插入。

解决方案 »

  1.   

    生成100万条8位不重复数据的示例USE tempdbGO -- 创建测试表CREATE TABLE tb(id char(8)) -- 创建用于自动过滤重复值的唯一索引CREATE UNIQUE INDEX IX_tb ON tb(id)WITH IGNORE_DUP_KEY GO -- 测试数据插入的处理时间, 记录开始处理的时间点DECLARE @dt datetimeSET @dt = GETDATE() -- 插入随机数据SET NOCOUNT ONDECLARE @row intSET @row = 1000000  -- 设置总记录数WHILE @row >0BEGIN    -- 显示提示信息, 表示还需要插入多行数据    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 - @@ROWCOUNTEND -- 显示插入数据使用的时间SELECT BeginDate = @dt, EndDate = GETDATE(),     Second = DATEDIFF(Second, @dt, GETDATE()),GO -- 显示最终的结果记录是否正确SELECT COUNT(*) FROM tbGO -- 删除测试DROP TABLE tb 解决中用到的技巧:1.    控制产生的数据不重复,直接使用唯一索引中的 IGNORE_DUP_KEY 选项,使插入数据中的重复值自动过滤,避免手工处理重复2.    使用 CHECKSUM 配合 NEWID() 函数,使生成的数据尽量随机,一般生成随机数会考虑使用 RAND() 函数,但这个函数是产生伪随机值,用下面的语句测试一下,会发现产生的数据全部是一样的,这不适用于想批量生成多个随机数,而NEWID() 函数生成的是GUID,基本上不会有重复的,再通过CHECKSUM将其转化成数字,这样产生重复的可能性会比较小SELECT TOP 10    RAND()FROM sysobjects3.    在效率控制,使用循环+批量生成的方式,而不是传统的逐个生成。在SQL Server中,每个插入语句都会有一个内部的事务处理,如果逐条插入,则事务的开销太大,效率势必非常低;不考虑一次性生成100万数据,一则因为生成的数据可能有重复的,去掉重复就没有100万了,二则一次性生成100万数据,消耗的内存和CPU资源也很高,一般的电脑可能承受不住
      

  2.   

    http://blog.csdn.net/zjcxc/archive/2006/08/20/1099215.aspx
      

  3.   


    建个数字表
    id
    1
    2
    3
    ...
    n
    insert tb select @a, id from 数字表 where id<@n
      

  4.   

    WITH 
    L1 AS (SELECT 1 AS Id UNION ALL SELECT ID + 1 from L1 WHERE ID < 4),
    L2 AS (select [key]='a'union select'b'union select'c')
    SELECT [key] , ID
    FROM L1,L2
    ORDER BY 1,2
    /*key  ID
    ---- -----------
    a    1
    a    2
    a    3
    a    4
    b    1
    b    2
    b    3
    b    4
    c    1
    c    2
    c    3
    c    4(12 row(s) affected)*/
      

  5.   

    top n 的方式效率高,循环的方式节省存储资源,各有所长。
      

  6.   

    用自增列生成一个表Tinsert 表
    select
    'a',
    ID
    from 
    T
    where ID<=@number
      

  7.   

    select 'a',i from(
    select row_number()over(order by a.id) as i from syscolumns a,syscolumns b)a
    where i<100
      

  8.   

    SQL 2k:
    declare @t table (id int identity(1,1),unused int)
    insert into @t
    select top 1000 1 from sysobjects a, sysobjects bselect 
      'a', id
    from @t
    where id<100