:私は、次の形式の文字列を使用して列を更新する必要があり、トリガーを追加する必要があり<current_date>_<per_day_incremental_id>
、例えば2015-10-01_36
。IDは増分である必要があり、ギャップは許容されます。
私のアプローチはかなり素朴です。現在の日付と現在のシーケンス値でテーブルを作成し、その中に単一のレコードを保持します。
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
質問:
- 私のソリューションに落とし穴はありますか?たとえば、トリガー内のコードはトランザクション内で実行されないため、不正な値が返されます。
- より良い解決策がありませんか?
トリガー内のコードは確かだろう基礎となる表の変更を開始し、トランザクションのコンテキスト内で実行されます。
—
Max Vernon
これらの値を連結して保存する必要があるのはなぜですか?これらの値は、実行時に決定されるのではなく、永続的である必要がありますか?
—
Aaron Bertrand
IDのギャップが許容される場合は、毎日リセットされない単純なシングル
—
Vladimir Baranov、2015年
IDENTITY
を使用して、現在の日付に追加できます。新しい日はだんだん「ギャップ」が大きくなるように見えますが、ギャップは許容されますね。もちろん冗談ですが、いくつかの要件を省略している必要があることを強調しています。