我有一張發票表,其中有InvoiceID(int identity)主鍵。以及一個整數列的InvoiceNumber。我有另一張表格用於生成名爲Invoice_Numbers的發票號碼(請參見下文)。爲了確保發票號碼是唯一的,並防止我實施了下面的代碼。有人可以檢查這些代碼並評論其可靠性嗎?在多用戶環境中運行SQL 2008。順序發票號碼SQL服務器
在插入發票期間,當用戶撥打主機時,用戶獲得相同發票號碼的機會是多少?
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[Imports].[Invoices_Numbers]') AND type IN (N'U')) DROP TABLE [Imports].[Invoices_Numbers]GO
CREATE TABLE [Imports].[Invoices_Numbers] ( [InvoiceNumber] [INT] IDENTITY(1, 1) NOT NULL ,[Deleted] [BIT] NOT NULL ,[Used] [BIT] NOT NULL, CONSTRAINT [PK_Invoices_Numbers] PRIMARY KEY CLUSTERED ([InvoiceNumber] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
GO
ALTER PROCEDURE [Imports].[Get_Invoice_Number] ( @InvoiceNumber INT OUTPUT ) AS BEGIN DECLARE @NewNumber INT DECLARE @MinNumber INT
BEGIN TRAN SELECT @MinNumber = MIN(InvoiceNumber) FROM Imports.Invoices_Numbers IF @MinNumber > 1 BEGIN SET IDENTITY_INSERT Imports.Invoices_Numbers ON; INSERT Imports.Invoices_Numbers ( Invoicenumber ,Deleted ,Used ) VALUES ( 1 ,0 ,1 ) SET IDENTITY_INSERT Imports.Invoices_Numbers OFF; SET @NewNumber=1 END ELSE BEGIN WITH Gaps AS (SELECT TOP 1 a.InvoiceNumber + 1 AS GapValue FROM Imports.Invoices_Numbers a WHERE NOT EXISTS (SELECT * FROM Imports.Invoices_Numbers b WHERE b.InvoiceNumber = a.InvoiceNumber + 1) AND a.InvoiceNumber < (SELECT MAX(InvoiceNumber) FROM Imports.Invoices_Numbers)) SELECT @NewNumber = GapValue FROM Gaps IF @NewNumber IS NULL BEGIN SELECT TOP 1 @NewNumber = InvoiceNumber FROM Imports.Invoices_Numbers WHERE Used = 0 AND Deleted = 0 ORDER BY InvoiceNumber IF @NewNumber IS NULL BEGIN INSERT Imports.Invoices_Numbers ( Deleted ,Used ) VALUES ( 0 ,1 ) SELECT @NewNumber = SCOPE_IDENTITY() END ELSE BEGIN UPDATE Imports.Invoices_Numbers SET Used = 1 WHERE InvoiceNumber = @NewNumber END END ELSE BEGIN SET IDENTITY_INSERT Imports.Invoices_Numbers ON; INSERT Imports.Invoices_Numbers ( Invoicenumber ,Deleted ,Used ) VALUES ( @NewNumber ,0 ,1 ) SET IDENTITY_INSERT Imports.Invoices_Numbers OFF; END END SELECT @InvoiceNumber = @NewNumber COMMIT TRAN
END
看到這麼問[如何會你在Microsoft SQL Server中實現序列?](http://stackoverflow.com/q/282943/880990) –
Gareth你還沒有看完整篇文章 –
Olivier剛剛通過鏈接。然而,它並沒有解決我試圖解決的關鍵問題。首先,環境是多用戶,所以proc的可能性很大。被同時稱爲在那裏。第二即時通訊使用第二張表來生成發票號碼(連續),我確保如果出現問題,填補空白。仔細查看proc。並看看即將進行的嘗試。 –