Ich muss einen Trigger hinzufügen, der eine Spalte mit den folgenden Formatzeichenfolgen aktualisieren soll: <current_date>_<per_day_incremental_id>
z 2015-10-01_36
. IDs müssen inkrementell sein und Lücken sind zulässig.
Mein Ansatz ist eher naiv: Erstellen Sie eine Tabelle mit dem aktuellen Datum und dem aktuellen Sequenzwert und führen Sie einen einzelnen Datensatz darin:
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
Fragen:
- Gibt es Fallstricke für meine Lösung? Beispielsweise wird Code innerhalb des Triggers nicht innerhalb einer Transaktion ausgeführt, wodurch falsche Werte angegeben werden.
- Vermisse ich eine bessere Lösung?
sql-server
sql-server-2008-r2
t-sql
sequence
Pavel Murygin
quelle
quelle
IDENTITY
, die nicht jeden Tag zurückgesetzt wird, und sie an das aktuelle Datum anhängen. Jeder neue Tag wird so aussehen, als hätte er eine immer größere "Lücke", aber die Lücke ist erlaubt, nicht wahr? Es ist natürlich ein Witz, aber es zeigt, dass Sie einige Anforderungen weggelassen haben müssen.Antworten:
Eine mögliche Methode hierfür wäre (siehe die bessere Methode am Ende):
Die Ergebnisse:
Nach alledem würde ich fragen, warum nicht einfach zwei separate Spalten beibehalten werden, die in der Präsentationsschicht verkettet werden könnten:
Die Ergebnisse:
Das obige Verfahren ist viel besser in der Lage zu skalieren und bietet Flexibilität bei der Darstellung der vom Menschen lesbaren Sequenznummer.
quelle
Sie können den Teil vereinfachen, der die
DailySequence
Tabelle aktualisiert . An Stelle von:Sie könnten dies verwenden:
Die
@ret
Variable würde somit in der UPDATE-Anweisung mit dem darin gespeicherten Wert initialisiertsequence
.Alternativ können Sie auch von der loszuwerden
set @nowDate = getdate();
durch Umschreiben der UPDATE wie diese Aussage:oder vielleicht sogar so:
Auf diese Weise der UPDATE - Anweisung wäre sowohl die Initialisierung
@nowDate
und@ret
. Die@tempDate
Variable würde bei beiden Optionen nicht benötigt.quelle