如果对 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联机手册
(我给的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联机手册
如果只是要生成唯一标识的话,这种方式应是比较好的。(个人看法^-^)
--如果只是导数据的话,可以想一个折中的办法
--先在来源表中增加一个新的字段 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秒吧,
--再说你也不会有哪么多的数据吧? ^-^ ^-^
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(邹建) ( )
通过两个字段相等来连接两张表:并更新一个字段不知为什么报错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
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) 的值唯一,
--子查询返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,
--或子查询用作表达式时,这种情况是不允许的。