Mam wymaganie biznesowe, aby każdy rekord w tabeli faktur miał identyfikator, który wygląda jak YYYYNNNNNN.
Część NNNNNN musi zostać uruchomiona ponownie na początku każdego roku. Tak więc pierwszy wiersz wprowadzony w 2016 roku będzie wyglądał jak 2016000001, a drugi jak 2016000002 itd. Powiedzmy, że ostatni rekord dla 2016 roku to 2016123456, Następny wiersz (z 2017 roku) powinien wyglądać jak 2017000001
Nie potrzebuję tego identyfikatora jako klucza podstawowego i przechowuję również datę utworzenia. Chodzi o to, że ten „identyfikator wyświetlania” jest unikalny (więc mogę za jego pomocą zapytać) i może być grupowany przez ludzi z roku na rok.
Jest mało prawdopodobne, aby jakiekolwiek zapisy zostały usunięte; Byłbym jednak skłonny kodować obronnie przed czymś takim.
Czy jest jakiś sposób, żebym mógł utworzyć ten identyfikator bez pytania o maksymalny identyfikator w tym roku za każdym razem, gdy wstawiam nowy wiersz?
Pomysły:
- A
CreateNewInvoiceSP
, która otrzymujeMAX
wartość za ten rok (szczęście) - Jakaś magiczna wbudowana funkcja do robienia dokładnie tego (mogę marzyć, dobrze)
- Będąc w stanie określić UDF lub coś w deklaracji
IDENTITY
lubDEFAULT
(??) - Widok, który używa
PARTITION OVER + ROW()
(usunięty byłby problematyczny) - Wyzwalacz włączony
INSERT
(nadal musiałby uruchomić jakieśMAX
zapytanie :() - Coroczne zadanie w tle, aktualizowałem tabelę z dodanym MAX dla każdego roku, który następnie ... Coś ?!
Z których wszystkie są nieco nie idealne. Wszelkie pomysły i odmiany są mile widziane!