2016-07-28 46 views
0

我正在研究一個允許我爲員工生成隨機ID號碼(6整數)的應用程序,但我想知道如何使用C#生成這些隨機數字,而不是重複已被其他員工使用的號碼在SQL數據庫中。下面是SQL做代碼:如何使用未在數據庫中列出的C#生成隨機數?

declare @unique_UID varchar(6) 

select @unique_UID = Right(ABS(CAST(CAST(NEWID() AS VARBINARY) AS INT)), 6) 

while exists (select 1 from dbo.tblUserID 

    where @unique_UID = UserID_UID 
     and len(@unique_uid) = 6 
     and @unique_UID <> @parm_User_Pin)(
     select @unique_UID = Right(ABS(CAST(CAST(NEWID() AS VARBINARY) AS INT)), 6) 

`

+2

爲什麼不把它作爲主鍵讓sql自動處理 – Steve

+0

當你有一個多用戶數據庫你需要創建一個SQL內置函數來保證唯一的主鍵。 – jdweng

+1

你最好把它保持在sql級別。將它移動到C#代碼將需要對每個生成的數字執行sql的往返測試,以測試它是否已存在於數據庫中。 –

回答

5

6 integeres使999999號。只要把它們全部寫在桌子上。然後隨機挑選一個並刪除它:

WITH cte AS (
    SELECT TOP (1) number 
    FROM available 
    ORDER BY NEWID() 
) 
    DELETE FROM cte 
    OUTPUT DELETED.number; 

這比試圖生成隨機和檢查可用性更可靠。如果你的組織已經有999998名員工了,試圖隨機生成一個仍然可用的組件將會需要很長時間...

+0

該方法是正確的,但是指定的問題是隨機的,您仍然可以從可用數字集中進行。無需更改問題參數。 – nycdan

+1

它是隨機的。 '... TOP(1).. ORDER BY NEWID()'表示隨機。 –

+1

你甚至可以使用['數字表'](http://dba.stackexchange.com/questions/11506/why-are-numbers-tables-invaluable)和OUTER JOIN與emplyees,篩選出那些匹配的TOP(1)隨機順序,消除實現/維護所有未使用數字的需要。 –