Я должен добавить триггер, который должен обновить столбец, используя следующие строки формата:, <current_date>_<per_day_incremental_id>
например 2015-10-01_36
. Идентификаторы должны быть инкрементными, и пробелы допускаются.
Мой подход довольно наивен: создайте таблицу с текущей датой и текущим значением последовательности и сохраните в ней одну запись:
create table DailySequence
(
date date,
sequence int
)
insert into DailySequence values (getdate(), 1);
CREATE TRIGGER MakeHumanReadableId ON dbo.AuditMeasures
FOR INSERT
AS
DECLARE @ret int;
DECLARE @tempDate date;
DECLARE @nowDate date;
SET @nowDate = getdate();
SELECT @ret = t.sequence, @tempDate = t.date from DailySequence as t;
IF @nowDate = @tempDate
BEGIN
SET @ret = @ret + 1;
UPDATE DailySequence
SET sequence = @ret;
END
ELSE
BEGIN
SET @ret = 0;
UPDATE DailySequence
SET sequence = @ret, date = @nowDate;
END
UPDATE AuditMeasures
SET [HumanReadableId] = CAST(@nowdate AS VARCHAR(10)) + '_' + CAST(@ret AS VARCHAR(10));
FROM inserted
INNER JOIN AuditMeasures On inserted.id = AuditMeasures.id
GO
Вопросов:
- Есть ли подводные камни для моего решения? например, код внутри триггера не будет выполняться внутри транзакции, что дает неправильные значения.
- Я пропускаю лучшее решение?
sql-server
sql-server-2008-r2
t-sql
sequence
Павел Мурыгин
источник
источник
IDENTITY
который не сбрасывается каждый день, и добавлять его к текущей дате. Каждый новый день будет выглядеть так, как будто он имеет все больший и больший «разрыв», но разрыв допускается, не так ли? Конечно, это шутка, но она подчеркивает, что вы должны были опустить некоторые требования.Ответы:
Один из возможных способов сделать это (см. Лучший метод в конце):
Результаты:
Сказав все это, я бы спросил, почему бы просто не поддерживать два отдельных столбца, которые можно объединить на уровне представления:
Результаты:
Вышеуказанный способ гораздо лучше подходит для масштабирования и обеспечивает гибкость в представлении читаемого человеком порядкового номера.
источник
Вы могли бы упростить часть обновления
DailySequence
таблицы. Вместо этого:Вы можете использовать это:
Таким образом,
@ret
переменная будет инициализирована в операторе UPDATE со значением, сохраненным вsequence
.В качестве альтернативы вы также можете избавиться от
set @nowDate = getdate();
оператора, переписав UPDATE следующим образом:или, может быть, даже так:
Таким образом, оператор UPDATE будет инициализировать
@nowDate
и@ret
.@tempDate
Переменный было бы не нужно ни с опцией.источник