Frage

Ich arbeite derzeit an einem Projekt, das einen Prozess haben muss, der einigen Datensätzen "Kontrollnummern" zuweist. Dies muss auch zu einem späteren Zeitpunkt ausgeführt werden und Datensätze ohne geänderte Kontrollnummer einbezogen werden und diesen Datensätzen eine nicht verwendete Kontrollnummer zuweisen können. Diese Kontrollzahlen werden von einer externen Entität vorgeschrieben und sind 9 Ziffern lang. Normalerweise erhalten Sie eine Reichweite, je nachdem, wie viele geschätzte Aufzeichnungen Ihr Unternehmen generieren wird. Zum Beispiel schätzte einer der Unternehmen, dass sie 50 benötigen würden, und zugewiesen uns den Bereich 790123401 bis 790123450.

Das Problem: Im Moment verwende ich Cursor, um diese Zahlen zuzuweisen. Für jeden einzelnen Datensatz überprüfe ich, ob die erste Zahl in der Sequenz bereits in der Tabelle aufgenommen wird. Wenn dies der Fall ist, erhöht ich die Zahl und überprüfen Sie sie erneut. Diese Überprüfung geht für jeden Datensatz in der Tabelle weiter und weiter. Eines der Unternehmen hat 17.000 Aufzeichnungen, was bedeutet, dass ich für jede der Aufzeichnungen möglicherweise im schlimmsten Fall 17.000 Mal iteriere, wenn alle Zahlen genommen wurden.

Es macht mir wirklich nichts aus, dass die Wiederholung des ersten Laufs seit dem ersten Lauf Steuernummern vielen Datensätzen zuweist. Mein Problem ist, dass, wenn später ein Rekord geändert wird und jetzt eine Kontrollnummer zugeordnet ist, die Wiederaufnahme des Prozesses bedeuten würde, dass sie jede verfügbare Nummer durchläuft, bis ich einen ungenutzten Verbrauch erhalte.

Ich habe zahlreiche Beispiele dafür gesehen, wie Sequenzen ohne Cursor verwendet werden, aber die meisten sind spezifisch für Oracle. Ich verwende SQL Server 2005 für dieses bestimmte Projekt.

Anregungen?

War es hilfreich?

Lösung

Sie suchen alle nicht zugewiesenen Zahlen in einem Bereich? Wenn ja, können Sie sich einem Zahlentable anschließen. In dem folgenden Beispiel wird ein CTE verwendet, um eines im Fliegen zu erstellen. Ich würde eine dauerhafte, die mindestens 17.000 Zahlen enthält, wenn dies die maximale Größe Ihres Bereichs ist.

DECLARE @StartRange int, @EndRange int
SET @StartRange = 790123401
SET @EndRange = 790123450;

WITH YourTable(ControlNumber) AS
(
SELECT 790123401 UNION ALL
SELECT 790123402 UNION ALL
SELECT 790123403 UNION ALL
SELECT 790123406
),
Nums(N) AS
(
SELECT @StartRange
UNION ALL
SELECT N+1
FROM Nums
WHERE N < @EndRange
)
SELECT N 
FROM Nums
WHERE NOT EXISTS(SELECT * 
                 FROM YourTable 
                 WHERE ControlNumber = N )
OPTION (MAXRECURSION 0)          
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top