2014-12-02 58 views
0

我有一個要求生成一個隨機數(代替身份),所以我嘗試了這些方法,但插入數據後,我遇到了一段時間的主鍵違規。數字(16,10)數據類型的隨機數

嘗試#1(舊的查詢):

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

嘗試#2(修改的查詢):

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

注:

第一個查詢總是得到當我們有多個記錄插入時重複。

第二個查詢在插入批量記錄前重複:ex:每個事務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

你將永遠無法保證任何隨機生成的號碼已經不存在在表格中。你將不得不提前檢查,或處理PK違規。 – 2014-12-02 18:09:02

+0

嗨比爾..是否有任何替代方案你能建議.. – user3094037 2014-12-02 18:13:26

+0

爲什麼要求排除使用'IDENTITY'?這是爲了這個任務。 – 2014-12-02 18:30:01

回答

1

縮小問題。如果您從1到10生成一個數字,需要多長時間才能獲得重複數據?您遇到的問題沒有什麼不同,除非遇到更大的問題。

如果您將某些東西用作生成的主鍵,則應使用標識列或GUID。例如,如果您正在對產品進行編目,那麼它就是SKU或PID或UPC等自然鍵。

事情是這樣的:

INSERT into #test (ID) 
    SELECT NEWID()