Je dois ajouter un déclencheur qui devrait mettre à jour une colonne en utilisant les chaînes de format suivantes:, <current_date>_<per_day_incremental_id>
par exemple 2015-10-01_36
. Les identifiants doivent être incrémentiels et les écarts sont autorisés.
Mon approche est plutôt naïve: créer un tableau avec la date actuelle et la valeur de séquence actuelle et y conserver un seul enregistrement:
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
Des questions:
- Y a-t-il des écueils pour ma solution? Par exemple, le code à l'intérieur du déclencheur ne s'exécutera pas à l'intérieur d'une transaction, donnant ainsi des valeurs incorrectes.
- Suis-je en train de manquer une meilleure solution?
sql-server
sql-server-2008-r2
t-sql
sequence
Pavel Murygin
la source
la source
IDENTITY
qui n'est pas réinitialisé tous les jours et l'ajouter à la date actuelle. Chaque nouveau jour aura l'air d'avoir un "écart" de plus en plus grand, mais l'écart est autorisé, n'est-ce pas? C'est une plaisanterie, bien sûr, mais cela souligne que vous devez avoir omis certaines exigences.Réponses:
Une méthode possible pour ce faire serait (voir la meilleure méthode, à la fin):
Les resultats:
Cela dit, je demanderais pourquoi ne pas simplement conserver deux colonnes distinctes qui pourraient être concaténées dans la couche de présentation:
Les resultats:
La méthode ci-dessus est beaucoup plus capable de bien évoluer et offre une flexibilité dans la présentation du numéro de séquence lisible par l'homme.
la source
Vous pouvez simplifier la mise à jour de la
DailySequence
table. Au lieu de cela:vous pouvez utiliser ceci:
La
@ret
variable serait donc initialisée dans l'instruction UPDATE avec la valeur stockée danssequence
.Alternativement, vous pouvez également vous débarrasser de l'
set @nowDate = getdate();
instruction en réécrivant la MISE À JOUR comme ceci:ou peut-être même comme ceci:
De cette façon, l'instruction UPDATE initialiserait à la fois
@nowDate
et@ret
. La@tempDate
variable ne serait pas nécessaire avec l'une ou l'autre option.la source