我的任務是爲項目每天創建一個遞增的序列號。多個進程(理論上在多臺機器上)需要產生這個。由於我在這個項目中使用的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