2014-05-09 12 views
0

我的數據庫中有一張發票表,其中插入了新的發票。最近我們升級了我們的服務,並有許多用戶將發票插入表格。我編寫了一個函數來計算序列中的下一個發票號(序列不僅僅是順序編號)。在插入語句中使用SQL函數

MAX(CAST(SUBSTRING([InvoiceNumber], 3, LEN([InvoiceNumber]) - 2) AS INT)) FROM [Invoice] WHERE [InvoiceNumber] LIKE @Prefix + '%' 

我現在想在INSERT語句中使用此功能如下

INSERT INTO [Invoice] 
([InvoicedTo] 
,[InvoiceNumber] 
,[InvoiceDate] 
,[Description] 
,[Amount]) 
VALUES 
(@InvoicedTo 
,NextInvoiceNumber(@Prefix) 
,@InvoiceDate 
,@Description 
,@Amount) 

我要確保使用此insert語句將保證發票號碼不能重複多次當用戶什麼正在生成發票。如果它可能導致重複,我將不勝感激關於如何停止任何重複發生的建議。

很多謝謝,保羅

回答

1

不知道這是有幫助的

begin tran 
declare @nextInvoiceNumber int = dbo.NextInvoiceNumber(@Prefix) 

INSERT INTO [Invoice] 
([InvoicedTo] 
,[InvoiceNumber] 
,[InvoiceDate] 
,[Description] 
,[Amount]) 
VALUES 
(@InvoicedTo 
,@nextInvoiceNumber 
,@InvoiceDate 
,@Description 
,@Amount) 

commit 

你可以/應該做的另一件事是添加約束給需要它是唯一的桌子上。 然後添加錯誤處理的事件發生,這隻會讓你另一個數字。

0

不,它不保證唯一性。

您應該將呼叫包裝在serializable transaction內。

0

您需要將嵌入腳本與事務(開始和提交/回滾)一起嵌入適當的isolation level