Мне поручено создавать увеличивающийся порядковый номер в день для проекта.Несколько процессов (теоретически на нескольких машинах) должны генерировать это.В итоге он выглядит как
[date]_[number]
как
20101215_00000001
20101215_00000002
...
20101216_00000001
20101216_00000002
...
Так как я в любом случае использую SQL Server (2008) в этом проекте, я попытался сделать это с T-SQL / SQLмагия.Вот где я сейчас нахожусь:
Я создал таблицу, содержащую порядковый номер, например:
CREATE TABLE [dbo].[SequenceTable](
[SequenceId] [bigint] IDENTITY(1,1) NOT NULL,
[SequenceDate] [date] NOT NULL,
[SequenceNumber] [int] NULL
) ON [PRIMARY]
Мое наивное решение до сих пор является триггером после вставки, который устанавливает SequenceNumber:
CREATE TRIGGER [dbo].[GenerateMessageId]
ON [dbo].[SequenceTable]
AFTER INSERT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- The ID of the record we just inserted
DECLARE @InsertedId bigint;
SET @InsertedId = (SELECT SequenceId FROM Inserted)
-- The next SequenceNumber that we're adding to the new record
DECLARE @SequenceNumber int;
SET @SequenceNumber = (
SELECT SequenceNumber FROM
(
SELECT SequenceId, ROW_NUMBER() OVER(PARTITION BY SequenceDate ORDER BY SequenceDate ASC) AS SequenceNumber
FROM SequenceTable
) tmp
WHERE SequenceId = @InsertedId
)
-- Update the record and set the SequenceNumber
UPDATE
SequenceTable
SET
SequenceTable.SequenceNumber = ''+@SequenceNumber
FROM
SequenceTable
INNER JOIN
inserted ON SequenceTable.SequenceId = inserted.SequenceId
END
Как я уже сказал, это довольно наивно и содержит целый день строк только для одного числа, которое мне больше никогда не понадобится: я делаю вставку, получаю сгенерированный порядковый номер и игнорируюстол потом.Не нужно хранить их на моей стороне, мне просто нужно сгенерировать их один раз.Кроме того, я почти уверен, что это не будет хорошо масштабироваться, постепенно становясь медленнее, чем больше строк в таблице (то есть я не хочу попадать в ловушку «работал на моей машине с 10.000 строками»).
Полагаю, что в настоящее время я смотрю на SQL с большим творческим подходом, но результат, кажется, менее полезен.Более умные идеи?