Создание триггера в SQL Server с автопоследовательностью на основе нескольких полей - PullRequest
0 голосов
/ 05 ноября 2019

Я пытаюсь создать триггер автопоследовательности для моего поля UniqueID в SQL Server, которое зависит от нескольких полей. Например, у меня есть таблица с именем animals со столбцами Species, Sex, UniqueID. Я пытаюсь создать триггер для ввода вида и пола. Поле UniqueID заполняется автоматически на основе последнего порядкового номера для этого вида и пола. Должен выглядеть как DeerM0001. Это то, что у меня есть, но это не работает.

CREATE TRIGGER tr_animalID
ON  animal
AFTER INSERT, UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    DECLARE @ID varchar(8)
    SET @ID = (SELECT max(Species) FROM animal);

    UPDATE animal
    SET UniqueID = CONCAT(Species, Sex) +0001 
    WHERE UniqueID = @ID;
END
GO

1 Ответ

0 голосов
/ 06 ноября 2019

Вот пример использования вычисляемого столбца с идентификатором для такого рода вещей. Я хотел бы предположить, что хранение Видов в виде строки не является хорошим планом. Вы должны иметь таблицу видов, чтобы не вводить имя снова и снова. Это предотвращает опечатки, а также легко допускает поддержку нескольких языков. Кроме того, обратите внимание, что правильное заполнение нулями, как у вас, имеет встроенное ограничение системы. В конце концов он будет исчерпан числами.

create table Animal
(
    AnimalID int identity
    , Species varchar(10) --this should really be a foreign key instead of the name over and over
    , Sex char(1) not null
    , UniqueID as Concat(Species, Sex) + right(replicate('0', 8) + convert(varchar(10), AnimalID), 6) --this pads the identity value to a max length of 6.
)

insert Animal values
('Deer', 'M')
, ('Deer', 'M')
, ('Deer', 'M')
, ('Deer', 'F')
, ('Deer', 'F')
, ('Deer', 'F')
, ('Deer', 'F')
, ('Deer', 'F')
, ('Goat', 'F')
, ('Goat', 'F')
, ('Goat', 'M')
, ('Goat', 'M')
, ('Goat', 'M')
, ('Goat', 'M')

select *
from Animal

Если вы действительно хотите использовать последовательность, базовый синтаксис такой простой.

create sequence MySequence as int start with 1 increment by 1

select next value for MySequence

Вы можете найти тысячи других примеров здесь .

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