MS SQL: Как сделать автоматическую нумерацию в таблице, и начинать заново в зависимости от текущего года

Имеется такая таблица, которая используется для регистрации отчётов

CREATE TABLE LVD.dbo.SampleReports (
   ID INT IDENTITY,
   ReportNum INT NULL, //номер отчёта
   ReportDate DATE NULL,  //дата отчёта
   CONSTRAINT PK_SampleReports_SampleReportID PRIMARY KEY CLUSTERED (SampleReportID)
) ON [PRIMARY]
GO

Как сделать, чтобы в столбец ReportNum при создании записи автоматически присваивался порядковый номер, при этом, чтобы при смене года в ReportDate (например закончился 2022 начался 2023) нумерация начиналась снова с 1.


Ответы (2 шт):

Автор решения: Vitaliy Zlobin

Можно завести вьюшку, в которой будет такой столбец:

ROW_NUMBER() OVER(PARTITION BY YEAR(ReportDate) ORDER BY Id) AS ReportNum 
→ Ссылка
Автор решения: Виктор Карев

Мне кажется, это не следует делать средствами SQL. Лучше это сделать на уровне контроллера, который создаёт отчёты.

  1. Начать транзакцию.
  2. Запросить максимальный номер отчёта за текущий год.
  3. Увеличить на 1 (если нет, то проставить 1).
  4. Записать отчёт с новым номером.
  5. Закрыть транзакцию.

Если делать на уровне SQL, то размывается логика продукта.

→ Ссылка