Thomas Bandt

Über mich | Kontakt | Archiv

SQL Server: eindeutige ID ohne Identity erzeugen

Unter bestimmten Umständen kann es vorkommen, dass man eine absolut eindeutige ID innerhalb einer Tabelle für einen Datensatz erzeugen muss, ohne dass man dafür Identity nutzen kann. Konkret z.B. immer dann, wenn man zum Beispiel eine Bestellung speichert, es aber vorkommen kann, dass diese Bestellung nicht abgeschlossen wird - und man erst dann eine eindeutige Bestell-Nummer generieren will, wenn das der Fall ist. Konkret habe ich das z.B. für die 1. Variante des PayPal-Workflows benötigt, weil hier Bestellprozesse vom Kunden jederzeit abgebrochen werden können.

Eine recht einfache und zugleich geniale Lösung ist hierfür die Verwendung einer Hilfstabelle, in der man die IDs speichert:

CREATE TABLE XyzNumbers (Invoice int NOT NULL)
INSERT INTO XyzNumbers SELECT 0

Das eindeutige Hochzählen der ID macht man dann wie folgt:

DECLARE @invoiceNumber int

BEGIN TRANSACTION

UPDATE dbo.XyzNumbers WITH (UPDLOCK)
SET @invoiceNumber = Invoice = Invoice + 1

UPDATE Orders WITH (ROWLOCK) SET InvoiceNumber = @invoiceNumber
WHERE
OrderID = @orderID and InvoiceNumber = 0

IF @@ROWCOUNT <> 1 RAISERROR('Fehler beim Erstellen der Rechnungsnummer', 16, 1)

IF @@ERROR = 0 COMMIT TRANSACTION
ELSE ROLLBACK

Es mag zunächst einwenig überflüssig anmuten, für eine einzelne ID eine ganze Tabelle anzulegen. Aber es spricht ja nichts dagegen für weitere IDs weitere Felder anzulegen. Darüber hinaus gibt einem diese Variante eine Flexibilität, wie man sie mit einem Identity-Feld nie bekommen kann: es ist nämlich möglich die ID jederzeit zurückzusetzen oder auf einen beliebigen Wert zu erhöhen.

Danke für den Tipp.



« Zurück  |  Weiter »