从@marc_s的解决方案为产生的每一个号码的新行。起初我并不认为我喜欢这个,但意识到我可以利用它对我有利。
我所做的是添加了一个日期时间审计列,还有一个@orderid参数存储过程。对于特定的orderid
,将保证返回相同的completedorderid
,这是来自序列发生器的编号。
如果由于某种原因,我的应用程序层请求下一个id,但在可以提交事务之前崩溃 - 它仍然会链接到该顺序,以便当再次请求时,将返回相同的编号。
这是我结束了:
USE [ShoppingCart]
GO
/****** Object: Table [dbo].[Sequence_CompletedOrderID] Script Date: 11/29/2009 03:36:40 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Sequence_CompletedOrderID](
[val] [int] IDENTITY(520000,1) NOT NULL,
[CreateDt] [datetime] NOT NULL CONSTRAINT [DF_Sequence_CompletedOrderID_CreateDt] DEFAULT (getdate()),
[Orderid] [int] NOT NULL CONSTRAINT [DF_Sequence_CompletedOrderID_Orderid] DEFAULT ((0)),
CONSTRAINT [PK_Sequence_CompletedOrderID] PRIMARY KEY CLUSTERED
(
[Orderid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
USE [ShoppingCart]
GO
/****** Object: StoredProcedure [dbo].[GetCompletedOrderId] Script Date: 11/29/2009 03:34:08 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROC [dbo].[GetCompletedOrderId]
@orderid AS INT,
@completedorderid AS INT OUTPUT
AS
IF EXISTS (SELECT * FROM dbo.Sequence_CompletedOrderID WHERE orderid = @orderid)
BEGIN
SET @completedorderid =(SELECT val FROM dbo.Sequence_CompletedOrderID WHERE orderid = @orderid)
END
ELSE
BEGIN
INSERT INTO dbo.Sequence_CompletedOrderID (orderid) VALUES (@orderid)
SET @completedorderid =(SELECT SCOPE_IDENTITY())
END
@marc_s becasue我已经在使用身份。这是一个人类可读的序列号。订单表也包含不完整的订单 – 2009-11-29 10:10:03
@Simon:好的 - 这是有道理的唯一原因:-) – 2009-11-29 10:12:35
@marc_s接受了几个更多的答案:-)我总是在切线时脱身,当我开始做,但我'm试图做得更好 – 2009-11-29 10:27:45