mymomo
Goto Top

MSSQL - Lücke in Laufnummern finden

Moin!

Ich habe folgendes Problem:

Es geht um Bezahlsysteme. Hier wird für jede Transaktion eine eigene Zeile geschrieben, welche eine fortlaufende Nummer hat.
Leider kommt es aus unbekannten Gründen dazu, dass teilweise einige Transaktionen nicht in die Datenbank geschrieben werden.
Ich möchte nun anhand einer abfrage herausfinden, welche Transaktionsnummer fehlen, um diese Transaktionen dann händisch zu finden und nachträglich einfügen zu können.

Um den Ganzen mal ein Namen zu geben:
actions: Name der Tabelle
transid: Name der Laufnummer
devices: es befinden sich mehrere Geräte in der Datenbank. Ich würde gerne immer von einem Gerät die "transid" checken wollen. zB von Gerät 10

Wie stelle ich das an?

Content-Key: 369996

Url: https://administrator.de/contentid/369996

Printed on: April 26, 2024 at 08:04 o'clock

Member: ukulele-7
ukulele-7 Apr 04, 2018 at 09:16:20 (UTC)
Goto Top
Also erstmal brauchst du als Grundlage eine wie auch immer geartete Tabelle die alle möglichen Transaktionsnummern beinhaltet. Wenn die Daten nicht gespeichert sind ließe sich das erstellen in dem man mit Rekursion hochzählt, siehe hier:
WITH t AS (
	SELECT	1 AS nummer
	UNION ALL
	SELECT	t.nummer + 1 AS nummer
	FROM	t
	WHERE	t.nummer + 1 < 10000
	)
SELECT	t.nummer
FROM	t
ORDER BY t.nummer
OPTION (MAXRECURSION 10000)
Das könnte man beschränken wenn man z.B. die höchste existierende Nummer aus der Tabelle ausließt und als WHERE-Bedingung erstellt. Problem ist immer die maximale Rekursionstiefe, die muss man schon ausreichend dimensionieren.

Darauf kannst du dann per LEFT JOIN deine Daten joinen und die Nummern, die keine Daten gejoint bekommen, werden per WHERE gefiltert, also ein effektiv ein LEFT OUTTER JOIN:
WITH t AS (
	SELECT	1 AS nummer
	UNION ALL
	SELECT	t.nummer + 1 AS nummer
	FROM	t
	WHERE	t.nummer + 1 < 10000
	)
SELECT	t.nummer
FROM	t
LEFT JOIN tabelle
ON		t.nummer = tabelle.nummer
WHERE	tabelle.nummer IS NULL
ORDER BY t.nummer
OPTION (MAXRECURSION 10000)
Member: it-frosch
it-frosch Apr 04, 2018 at 16:03:56 (UTC)
Goto Top
Hallo mymomo,

mehr was für die Zukunft.

1. Tabelle tbl_device_nrkreis für Nummernkreis pro Device erstellen. Devices, transid - transid auf größten Werte aus der Tabelle actions setzen.
2.1. Trigger auf tabelle actions der beim Insert für das device in tbl_device_nrkreis transid=transid+1 setzt.
2.2. sind actions.new.transid und tbl_device_nrkreis.transid nicht gleich tbl_device_nrkreis.transid in eine Logtabelle schreiben oder dir per SQL Email zusenden.

grüße vom it-frosch