Eu tenho que adicionar um gatilho que deve atualizar uma coluna usando as seguintes seqüências de formato:, <current_date>_<per_day_incremental_id>
por exemplo 2015-10-01_36
. Os IDs devem ser incrementais e as lacunas são permitidas.
Minha abordagem é bastante ingênua: faça uma tabela com a data atual e o valor atual da sequência e mantenha um único registro nela:
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
Questões:
- Existem armadilhas para a minha solução? por exemplo, o código dentro do gatilho não será executado dentro de uma transação, fornecendo valores incorretos.
- Estou perdendo uma solução melhor?
sql-server
sql-server-2008-r2
t-sql
sequence
Pavel Murygin
fonte
fonte
IDENTITY
que não seja redefinida todos os dias e anexá-la à data atual. Cada novo dia parecerá ter cada vez mais espaço, mas o espaço é permitido, não é? É uma piada, é claro, mas destaca que você deve ter omitido alguns requisitos.Respostas:
Um método potencial de fazer isso seria (veja o melhor método, no final):
Os resultados:
Dito tudo isso, eu perguntaria por que não simplesmente manter duas colunas separadas que poderiam ser concatenadas na camada de apresentação:
Os resultados:
O método acima é muito mais capaz de escalar bem e oferece flexibilidade na apresentação do número de sequência legível por humanos.
fonte
Você pode simplificar a parte que atualiza a
DailySequence
tabela. Em vez disso:você poderia usar isso:
A
@ret
variável seria assim inicializado na declaração UPDATE com o valor armazenado emsequence
.Como alternativa, você também pode se livrar da
set @nowDate = getdate();
declaração reescrevendo UPDATE da seguinte maneira:ou, talvez, mesmo assim:
Dessa forma, a instrução UPDATE inicializaria ambos
@nowDate
e@ret
. A@tempDate
variável não seria necessária com nenhuma das opções.fonte