Ich habe eine Geschäftsanforderung, dass jeder Datensatz in der Rechnungstabelle eine ID hat, die wie JJJJNNNNNN aussieht.
Der NNNNNN-Teil muss zu Beginn eines jeden Jahres neu gestartet werden. Die erste Zeile, die 2016 eingegeben wurde, würde also wie 2016000001 und die zweite wie 2016000002 usw. aussehen. Nehmen wir an, der letzte Rekord für 2016 war 2016123456, die nächste Zeile (von 2017) sollte wie 2017000001 aussehen
Ich brauche diese ID nicht als Primärschlüssel und speichere auch das Erstellungsdatum. Die Idee ist, dass diese 'Anzeige-ID' nach Jahr eindeutig (damit ich sie abfragen kann) und gruppenfähig ist.
Es ist unwahrscheinlich, dass Datensätze gelöscht werden. Ich wäre jedoch geneigt, defensiv gegen so etwas zu programmieren.
Gibt es eine Möglichkeit, diese ID zu erstellen, ohne jedes Jahr bei jedem Einfügen einer neuen Zeile nach der maximalen ID fragen zu müssen?
Ideen:
- A
CreateNewInvoiceSP
, das denMAX
Wert für dieses Jahr erhält (yucky) - Einige magische integrierte Funktionen, um genau dies zu tun (ich kann richtig träumen)
- In der Lage sein, eine UDF oder etwas in der
IDENTITY
oderDEFAULT
Deklaration (??) anzugeben - Eine Ansicht, die verwendet
PARTITION OVER + ROW()
(gelöscht wäre problematisch) - Ein Trigger ein
INSERT
(müsste noch eineMAX
Abfrage ausführen :() - Ein jährlicher Hintergrundjob, aktualisiert eine Tabelle mit dem MAX für jedes eingefügte Jahr, die ich dann ... Etwas?!
All das ist ein bisschen nicht ideal. Irgendwelche Ideen oder Variationen sind jedoch willkommen!