2016-07-28 8 views
0

Ich arbeite an einer Anwendung, die mir erlaubt, zufällige ID-Nummern (6 ganze Zahlen) für Mitarbeiter zu generieren, aber ich würde gerne wissen, wie diese Zufallszahlen mit C# generieren und nicht die Zahlen kopieren, die bereits von einem anderen Mitarbeiter verwendet wurde in der SQL-Datenbank. Unten ist der Code in SQL getan:Wie generiert man Zufallszahlen mit C#, die nicht in einer Datenbank aufgelistet wurde?

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

warum nicht einfach einen Primärschlüssel erstellen und sql automatisch damit umgehen lassen – Steve

+0

Wenn Sie einen Multi-User haben Datenbank müssen Sie eine integrierte SQL-Funktion erstellen, um einen eindeutigen Primärschlüssel zu garantieren. – jdweng

+1

Sie halten es besser auf dem sql-Level. Das Verschieben in den C# -Code würde für jede generierte Zahl einen Umlauf zum SQL-Wert erfordern, nur um zu testen, ob es bereits in der Datenbank vorhanden ist. –

Antwort

5

6 integeren macht 999999 Zahlen. Schreib sie einfach alle verfügbaren in eine Tabelle. Dann einen Pick zufällig und löscht es:

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

Dies ist zuverlässiger als zu versuchen, zufällig zu erzeugen und die Verfügbarkeit überprüfen. Wenn Ihre Organisation bereits 999998 Mitarbeiter hat, wird es ewig dauern, den noch verfügbaren zu erstellen ...

+0

der Ansatz ist richtig, aber die Frage zufällig angegeben, die Sie immer noch aus der Menge der verfügbaren Nummern tun können. Keine Notwendigkeit, die Frageparameter zu ändern. – nycdan

+1

Es ist zufällig. '... TOP (1) .. ORDER BY NEWID()' bedeutet zufällig. –

+1

Sie können sogar eine ['numbers table'] (http://dba.stackexchange.com/questions/11506/why-are-numbers-tables-invaluable) und OUTER JOIN mit den Mitarbeitern verwenden, filtern Sie diejenigen heraus, die dann übereinstimmen TOP (1) zufällige Reihenfolge, um die Notwendigkeit zu vermeiden, alle nicht verwendeten Nummern zu materialisieren/zu pflegen. –