我的任务是为项目每天创建一个递增的序列号。多个进程(理论上在多台机器上)需要产生这个。由于我在这个项目中使用的SQL Server(2008)反正它结束了作为Microsoft SQL Server:每天生成一个序列号
[date]_[number]
像
20101215_00000001
20101215_00000002
...
20101216_00000001
20101216_00000002
...
,我试图用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 = ''[email protected]
FROM
SequenceTable
INNER JOIN
inserted ON SequenceTable.SequenceId = inserted.SequenceId
END
正如我所说的那样,这太天真了,并且为一个单独的数字保留了整整一天的行数,我不再需要:我做一个插入,获取生成的序列号,然后忽略表。没有必要商店他们在我身边,我只需要生成一次。另外,我很确定这不会很好地扩展,表中包含的行越多,越慢(即我不想陷入“在我的开发机器上只有10.000行的陷阱”)。
我想现在的方式更多的是用一些创造力来看待SQL,但结果似乎是 - erm - 没那么有用。更聪明的想法?
取决于你能指望realisticly每天要插入,您可以创建一张桌子,并在接下来的100年里每天预先填充组合。之后,选择并删除当前日期的MIN序列。 – 2010-12-15 13:17:57
您的触发器代码对于多行插入本质上是不安全的(因为它假定插入包含单个行) – 2010-12-15 13:47:05
由于我是唯一插入 - 没关系。这只是我担心的正确和表现。 – 2010-12-15 16:10:48