SQL Server: вопрос реализации генератора серийных номеров - PullRequest
0 голосов
/ 27 октября 2009

Моим клиентам нужен формат серийного номера: ГГГГММДД098, где ГГГГММДД представляет сегодня, 098 - это трехзначное число, которое будет увеличиваться на 1 при каждом доступе к серийному номеру ,

Кроме того, 3-значный # будет возвращаться к нулю каждый день.

Где найти ссылку на это решение?

Спасибо.

Ответы [ 3 ]

1 голос
/ 27 октября 2009

Вам, вероятно, понадобится таблица для хранения этих серийных номеров. Убедитесь, что вы храните дату и число в отдельных столбцах, чтобы вы могли легко ими манипулировать. Чтобы создать новый серийный номер, выполните (в транзакции):

  • Заблокируйте таблицу, чтобы избежать состояния гонки при попытке создать два серийных номера одновременно. Как это сделать, зависит от базы данных, которую вы используете, но вам нужна блокировка, которая разрешает чтение, но запрещает запись.
  • SELECT max(serial_no) FROM table WHERE serial_date = ?.
  • Если результат равен NULL, сделать его 0, в противном случае увеличить его на единицу.
  • Вставьте новый серийный номер в таблицу.
  • Разблокировать стол.
1 голос
/ 27 октября 2009

для SQL Server

DECLARE @OldID char(11), @NewID char(11);
DECLARE @IDbit char(3), @CurrDate char(8)

SET @OldID = '20091027098'
--SET @OldID = '20091026098'

SELECT
    @IDbit = SUBSTRING(@OldID, 9, 3),
    @CurrDate = CONVERT(char(8), GETDATE(), 112)

IF @CurrDate <> LEFT(@OldID, 8)
    SET @NewID = @CurrDate + '000'
ELSE
    SET @NewID = @CurrDate + RIGHT('00' + CAST(CAST(@IDbit AS tinyint) + 1 AS varchar(3)), 3)

SELECT @NewID
0 голосов
/ 27 октября 2009

Это слишком сложное требование для того, чтобы было готовое решение, на которое кто-то может просто указать. Мне не очень понятно, что вы имеете в виду под «доступом», потому что вам нужно какое-то обновление, чтобы вспомнить, куда вы дошли. Кроме того, я бы использовал более чем трехзначный счетчик - вы наверняка переполните его некоторое время.

Я бы предложил что-то вроде этого:

Установите таблицу с одной строкой для хранения счетчика и установите ее начальное значение на сегодняшнюю дату + 000 (например, 20091027000). Создайте хранимую процедуру, которая внутри транзакции увеличивает счетчик и возвращает новое значение. Чтобы перезапускать последовательность в 000 каждое утро, вы можете сделать это в запланированном задании или получить хранимую процедуру, чтобы сравнить часть счетчика даты с сегодняшней датой и сбросить счетчик, если это не сегодня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...