Saya harus menambahkan pemicu yang harus memperbarui kolom menggunakan string format berikut:, <current_date>_<per_day_incremental_id>
misalnya 2015-10-01_36
. Id harus bertahap dan celah diizinkan.
Pendekatan saya agak naif: buat tabel dengan tanggal saat ini dan nilai urutan saat ini dan pertahankan satu catatan di dalamnya:
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
Pertanyaan:
- Apakah ada jebakan untuk solusi saya? misalnya kode di dalam pemicu tidak akan berjalan di dalam transaksi sehingga memberikan nilai yang salah.
- Apakah saya melewatkan solusi yang lebih baik?
sql-server
sql-server-2008-r2
t-sql
sequence
Pavel Murygin
sumber
sumber
IDENTITY
yang tidak diatur ulang setiap hari dan menambahkannya ke tanggal saat ini. Setiap hari baru akan terlihat seolah-olah memiliki "celah" yang lebih besar dan lebih besar, tetapi celah itu diperbolehkan, bukan? Ini memang lelucon, tetapi ini menyoroti bahwa Anda harus menghilangkan beberapa persyaratan.Jawaban:
Salah satu metode potensial untuk melakukan ini adalah (lihat metode yang lebih baik, di bagian akhir):
Hasil:
Setelah mengatakan semua itu, saya akan bertanya mengapa tidak hanya mempertahankan dua kolom terpisah yang dapat digabungkan dalam lapisan presentasi:
Hasil:
Metode di atas jauh lebih mampu melakukan penskalaan dengan baik, dan menawarkan fleksibilitas dalam penyajian nomor urut yang dapat dibaca manusia.
sumber
Anda bisa menyederhanakan bagian yang memperbarui
DailySequence
tabel. Alih-alih ini:Anda bisa menggunakan ini:
The
@ret
variabel dengan demikian akan dijalankan dalam laporan UPDATE dengan nilai yang disimpan dalamsequence
.Atau Anda juga bisa menghilangkan
set @nowDate = getdate();
pernyataan dengan menulis ulang UPDATE seperti ini:atau, mungkin, bahkan seperti ini:
Dengan cara ini pernyataan UPDATE akan menginisialisasi keduanya
@nowDate
dan@ret
. The@tempDate
variabel tidak akan diperlukan dengan baik pilihan.sumber