Я работаю с Microsoft SQL Server 2014. В нашем требовании используется индивидуальный отформатированный порядковый номер.SQL Server: автоматический сгенерированный пользовательский формат, порядковый номер
Формат порядкового номера: CAT-YYYY-MM-NNNNNN
. Пример данных:
CAT-2016-10-000001
CAT-2016-10-000002
.
.
.
CAT-2016-10-999999
Я не хочу использовать GUID или любой другой, и я хочу работать с процедурой или функцией.
Итак, я пытаюсь с этим:
CREATE TABLE [category]
(
[id] int NOT NULL UNIQUE IDENTITY,
[category_no] nvarchar(20) NOT NULL,
[category_name] nvarchar(50) NOT NULL,
PRIMARY KEY ([id])
);
CREATE FUNCTION generate_category_no()
RETURNS CHAR(20)
AS
BEGIN
DECLARE @category_no CHAR(20)
SET @category_no = (SELECT MAX(category_no) FROM category)
IF @category_no IS NULL
SET @category_no = 'CAT-' + YEAR(getDate()) + '-' + MONTH(getDate()) + '-000001'
DECLARE @no int
SET @no = RIGHT(@category_no,6) + 1
RETURN 'CAT-' + YEAR(getDate()) + '-' + MONTH(getDate()) + '-' + right('00000' + CONVERT(VARCHAR(10),@no),6)
END
GO
ALTER TABLE category DROP COLUMN category_no;
ALTER TABLE category ADD category_no AS dbo.generate_category_no();
INSERT INTO category (category_name)
VALUES ('BMW'), ('JAGUAR');
Когда я запускаю выше SQL в шаг за шагом, это нормально. Это не показало ошибки. Но когда я запускаю следующую команду:
SELECT * FROM category;
он показывает следующее сообщение об ошибке:
Msg 217, Level 16, State 1, Line 1
Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32).
Я не знаю, как решить эту. И даже я не знаю, что моя функция работала или нет. Я ссылаюсь из Интернета на эту функцию.
ДОБАВЛЕНО
мне нужно сбросить последовательность не за каждый месяц. Например. на следующий месяц, не должно быть:
CAT-2016-11-000001
Прошу, просветите меня. Заранее спасибо!
Что делать, если две сессии выполняются (SELECT MAX (category_no) FROM category) одновременно? Кто получает значение +1? –
Вы получаете ошибку при выборе данных из таблицы или при выполнении функции или при создании функции? Существуют ли триггеры, связанные с таблицей? – Aditya
Нет, в db нет триггера. Только эта функция. –