2012-06-07 66 views
0

我有一張發票表,其中有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

+1

看到這麼問[如何會你在Microsoft SQL Server中實現序列?](http://stackoverflow.com/q/282943/880990) –

+0

Gareth你還沒有看完整篇文章 –

+0

Olivier剛剛通過鏈接。然而,它並沒有解決我試圖解決的關鍵問題。首先,環境是多用戶,所以proc的可能性很大。被同時稱爲在那裏。第二即時通訊使用第二張表來生成發票號碼(連續),我確保如果出現問題,填補空白。仔細查看proc。並看看即將進行的嘗試。 –

回答

1

您的解決方案看起來有點複雜。除了數據導入任務外,我不會推薦使用set identity_insert

爲了保證唯一性,我想先添加一個唯一約束:

alter table Invoices add constraint UX_Invoices_InvoiceNr unique 

那麼你可以使用一個SQL語句,這樣插入發票:

while 1=1 
    begin   
    declare @new_nr int 
    select @new_nr = max(InvoiceNr) + 1 
    from dbo.Invoices 

    if @new_nr is null 
     set @new_nr = 1 

    insert dbo.Invoices 
      (InvoiceNr, ...) 
    values (@new_nr, ...) 

    if @@rowcount = 1 
     break 
    end 
+0

看起來更優雅。讓我試試你的方法,並讓你知道 –

+0

感謝很多偉大的工程,並確保沒有差距。我製作了一張樣品桌,並嘗試了一些扭曲和轉動,它似乎給我正是我需要的東西。再次感謝!!! –

+3

只需爲使用此方法的任何人添加即可。您必須確保您不要刪除發票,因爲這會產生問題,因爲您獲得的數字是基於行數的。我選擇刪除發票而不是實際刪除它們。 –