如果对 RAND 的调用包括在单个批处理中,尤其可能会生成重复值
(我给的rand还只截取3位,重复性更高),可以增加取rand字符串长,如:
substring(cast(rand() as char),3,12)但这样的话,数字就不至20位(测试批量生成10000条时无重复)。但是由于是机数,就存在最小增量毫秒内出现重复的可能性。
这倒是个难题,可以请教一下高人。
如果要生成唯一标识的话,可以参考使用一下newid()函数。
创建具有 uniqueidentifier 数据类型字段的表,并使用 NEWID 将默认值填充到表中。为 NEWID() 赋默认值时,每个新行和现有行均具有 cust_id 列的唯一值
例如:CREATE TABLE test
(id uniqueidentifier NOT NULL
   DEFAULT newid())
--写数据时:
INSERT test
(id)
VALUES
(newid())详细内容请参考:SQL2000联机手册

解决方案 »

  1.   

    newid() 生成的唯一标识是这种格式的:'A972C577-DFB0-064E-1189-0154C99310DAAC12'
    如果只是要生成唯一标识的话,这种方式应是比较好的。(个人看法^-^)
      

  2.   


    --如果只是导数据的话,可以想一个折中的办法
    --先在来源表中增加一个新的字段 tmp_id,类型:bigint,标识列,种子:100000,增量1。
    --目的是在来源表生成6位数的唯一标识
    alter table 来源表  
    add [ID] [bigint] IDENTITY (100000, 1) NOT NULL
    --执行导出语句
    insert into 目的表  (id,name)
    select (replace(convert(char, GETDATE(),102),'.','') +
    replace(convert(char, GETDATE(),108),':','') +
    convert(char,id)  ),name  from 源表
    --这样当记录超过999999的时候才有可能出现取 6 位值的重复:
    --但是前面的16位是以时间唯一到秒的,我想sql执行999999条记录总也得1秒吧,
    --再说你也不会有哪么多的数据吧?  ^-^  ^-^
      

  3.   

    谢谢,此问题已解决 是通过建临时表 解决的 
    select id=identity(int),
    replace(convert(char, GETDATE(),102),'.','')  + 
    replace(convert(char, GETDATE(),14),':','')   + 
    substring(cast(rand() as char),3,3) as dataid,
    档号 as field1
    into #t from Ewsroll 
    while exists(select dataid from #t group by dataid having count(*)>1)
    begin
    update a set 
    field1=replace(convert(char, GETDATE(),102),'.','')  + 
    replace(convert(char, GETDATE(),14),':','')   + 
    substring(cast(rand() as char),3,3)
    from #t a,(select id=min(id) from #t group by dataid having count(*)>1)b
    where a.id=b.id
    endinsert into tmpTime(dataid,field1)  select dataid,field1 from #tdrop table #t
    作者是 zjcxc(邹建) ( )
      

  4.   

    还有一个问题:   两张表 ,field30字段中有相同值
    通过两个字段相等来连接两张表:并更新一个字段不知为什么报错update udt_data_piece a set rolldataid=(select dataid from udt_data_roll b where a.field30=b.field30)服务器: 消息 170,级别 15,状态 1,行 1
    第 1 行: 'a' 附近有语法错误。之前用过是没问题的阿 (oracle中)  现在是sql2000
      

  5.   

    update a
    set rolldataid =(select b.dataid from udt_data_roll b 
    where a.field30=b.field30)
    from udt_data_piece  a--但是要保证 (select b.dataid from udt_data_roll b 
    --where a.field30=b.field30) 的值唯一,
    --子查询返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,
    --或子查询用作表达式时,这种情况是不允许的。