T- SQL Создание настраиваемого столбца с триггером или функцией - PullRequest
0 голосов
/ 06 марта 2020

Я работаю над столбцом базы данных, я выбираю триггер и функцию. Мне кажется, что мне понадобится 1 из них, потому что я не думаю, что хранимая процедура может быть запущена после вставки. Я открыт для любых предложений, хотя у меня есть столбец, который будет нуждаться в строковом значении, а затем в текущем году из 2 цифр, за которыми следует - и счетчик после. В начале нового года мне потребуется перезапустить счетчик в 001. Как мне это сделать?

EX. VSP20-001, VSP20-002… и следующий год, VSP21-001, VSP21-002…

Вот начало моего триггера. Я знаю, что нужно намного больше. Я не уверен, должен ли я сделать это как вычисляемый столбец или я могу сделать все это всего за 1 столбец.

CREATE TRIGGER trg_ProposalTest
ON dbo.Serv_Quotes
AFTER INSERT
AS
BEGIN
    DECLARE @yearTst nvarchar(10);
    SET @yearTst = (SELECT FORMAT(GETDATE(), 'yy'))

    DECLARE @word nvarchar(5);
    SET @word = 'VSP';

    DECLARE @counter int;
    SET @counter = RIGHT(@fullvar,3) + 1; -- still need to create this

1 Ответ

0 голосов
/ 06 марта 2020

В качестве альтернативного подхода вы можете выполнить все это с помощью значения по умолчанию для столбца, в котором используется объект SEQUENCE. (К сожалению, вы не можете использовать последовательность в вычисляемом столбце. Не можете объяснить это различие.)

Вы можете создать простую последовательность для вашего окончательного значения, а затем просто объединить остальные значения вместе в определение значения по умолчанию.

Чтобы выполнить цикл для ежегодного сброса, создайте задание агента SQL (или какой-либо другой инструмент планирования), чтобы запустить оператор ALTER для сброса последовательности.

create sequence dbo.ProjID
AS INTEGER
START WITH 10
INCREMENT BY 1;

GO

create table testseq (
    ID bigint identity(1,1) not null,
    val int,
    testVal nvarchar(10) default ( CONCAT( 'VSP', YEAR( GETDATE() ) % 100 , '-', 
                                   RIGHT( CONCAT('000', NEXT VALUE FOR dbo.ProjID), 3)))
);

GO

insert testseq (val) values (1), (2);

select * from testseq;

Результаты:

+----+-----+-----------+
| ID | val |  testVal  |
+----+-----+-----------+
|  1 |   1 | VSP20-010 |
|  2 |   2 | VSP20-011 |
+----+-----+-----------+

Затем, 1 января каждого года:

ALTER SEQUENCE dbo.ProjID
  RESTART;

Поиграйте с этим здесь и посмотрите, что вы думаете.

Rextester Demo .

...