TSQL Generieren 5 Zeichen string der Länge, alle Ziffern, [0-9], die nicht bereits in der Datenbank
Was ist der beste Weg, dies zu tun?
Brauche ich, um zu generieren, eine 5-stellige Zeichenfolge mit der Länge, wo alle Zeichen numerisch sind. Ich muss jedoch dazu in der Lage " x " Höhe der Zeit (user-variable) und speichern Sie diese zufällige Zeichenfolgen in einer Datenbank. Desweiteren kann ich nicht erzeugen die gleiche saite doppelt. Die alten Saiten entfernt werden, nach 6 Monaten.
Pseudo-code
DECLARE @intIterator INT,
@intMax
SET @intIterator = 1
SET @intMax = 5 (number of strings to generate)
WHILE @intIterator <= @intMax
BEGIN
-- GENERATE RANDOM STRING OF 5 NUMERIC DIGITS
???
-- INSERT INTO DB IF DOESN'T ALREADY EXIST
INSERT INTO TSTRINGS
SELECT @RANDOMSTRING
IF @@ERROR = 0
SET @intIterator = @intIterator + 1
END
Ich weiß, dies ist wahrscheinlich nicht der beste Weg, es zu tun, so beraten wird sehr geschätzt. Aber wirklich auf der Suche nach Ideen, wie zu generieren der 5 numerische Zeichenfolgen der Länge.
- Einen bestimmten Grund tun Sie dies ganz in TSQL?
- Andere als die Tatsache, brauche ich zum speichern der 5-stellige numerische Zeichenfolgen in einer Datenbank? Ich denke mal nicht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Alles in einem. Dies sollte die @intMax restlichen Werte, wenn Sie (100000 - @intMax) Zeilen, die bereits mit nur @intMax Permutationen Links
Die "offensichtliche" Art und Weise beschrieben werden kann als "
key = random; while (key already selected) { key = random }
". Es funktioniert, aber die Geburtstag paradox bedeutet, unser Quoten-Schlüssel Kollision erhöhen in einem alarmierenden exponentiellen rate im Verhältnis zu der Anzahl der Schlüssel bereits verwendet. Also, die Auswahl eines random-Taste, im Durchschnitt dauert exponentiell länger mit jeder neuen Schlüssel, und ist sehr wahrscheinlich, gefangen in einem unendlichen oder beliebig lange Schleife schließlich.Bist du viel besser dran, generieren Ihre Liste der Schlüssel, die vorne wie folgt:
Halten Sie eine Tabelle
UniqueKeys
mit allen vordefinierten strings '00000' .. '99999' neben einerkeyOrder
Feld, das ist immer initialisiertnewId()
auf einfügen.keyOrder
indiziert werden sollen.Wenn Sie brauchen, um "generate" eine Zeichenfolge ist, können Sie
SELECT TOP 1
key
AUS UniqueKeys, UM DURCH keyOrder, die ziehen die nächsten Schlüssel, die in nahezu konstanter Zeit. Jetzt haben Sie einen Schlüssel, können Sie es löschen ausUniqueKeys
zu verhindern, dass es wiederverwendet werden kann.Alle sechs Monate, abschneiden und regenerieren Sie Ihre
UniqueKeys
Tabelle.Vorteil dieses Stils ist die vergleichsweise einfache Implementierung, nahezu konstanter Zeit generieren Sie die nächste Taste, und vermeiden das böse "schauen, wenn vorhanden in ein-loop" - Szenario, wie oben beschrieben.
Müssen Sie die Logik, um zu überprüfen, ob die Nummer existiert?
Könnten Sie Folgendes verwenden, um das generieren der Zufallszahl:
Dann rufen Sie RandNumber in Ihr wählen Sie.
Hier ist die Website, die ich gefunden mit diesem Skript: Hier
Sowas?
Einen Weg zu erzeugen, so ein string ist:
Als Einzigartigkeit, Sie würde schaffen müssen, um eine Schleife rund um den Tisch mit dem (indizierten!) bereits vorhandene Werte, nur verlassen der Schleife, wenn eine "neue" id generiert. Sie schlagen könnte die Parallelität Probleme, wenn zwei separate Prozesse, die irgendwie generieren den gleichen Wert, wobei die erste nicht, geben Sie es in der Tabelle vor der zweiten Prüfungen für die Existenz... aber viel hängt davon ab, Wann und wie dieser Wert tatsächlich verwendet wird.
Hier ist ein set-basierten Ansatz unter Verwendung von SQL 2005-syntax (wäre ein wenig einfacher, mit SQL 2008, aber Sie nicht angegeben haben). Auch, wenn Sie eine zahlen-Tabelle, die einen großen Teil des es kann ausgeschnitten werden.
Kein looping, keine Duplikate, und sollte fast augenblicklich (vorausgesetzt, die Ziel-Spalte indiziert ist).