数字(16,10)数据类型的随机数

时间:2014-12-02 18:06:52

标签: sql sql-server

我需要生成一个随机数(代替身份),所以我尝试了这些方法,但是在插入数据后,我在一段时间后遇到了主键违规。

尝试#1(旧查询):

SELECT CONVERT(NUMERIC (14,2), GETDATE()) * rand() 
FROM sometable  

尝试#2(修改后的查询):

SELECT CONVERT(NUMERIC(14,2), GETDATE()) * RAND(CAST(NEWID() AS VARBINARY)) 
FROM sometable 

注意:

当我们要插入多个记录时,第一个查询总是会重复。

第二个查询在插入批量记录时会重复:每个事务5000条记录。

示例表结构:

CREATE table #test
(
     id numeric(16,10) primary key
)

查询:

INSERT into #test (ID)
   SELECT CONVERT(NUMERIC(14, 2), GETDATE()) * RAND(CAST(NEWID() AS VARBINARY)) 
   FROM sys.objects

SELECT * FROM #test

要求:

我需要插入任意大量的行而不会发生任何主键冲突。

请告知 - 我也对其他任何其他想法持开放态度。

提前致谢..

如果我的问题不够明确,请纠正我。

1 个答案:

答案 0 :(得分:1)

缩小问题。如果您生成的数字从1到10,那么获取副本需要多长时间?您遇到的问题没有什么不同,除了问题集更大。

如果您使用某些内容作为生成的主键,则应使用标识列或GUID。例如,如果您正在对产品进行编目,那就是SKU,PID或UPC等自然键。

这样的事情:

INSERT into #test (ID)
  SELECT NEWID()