我的数据库中有一张发票表,其中插入了新发票。最近我们升级了我们的服务,并且有许多用户将发票插入表中。我编写了一个函数来计算序列中的下一个发票号(序列不仅仅是顺序编号)。
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语句可以保证在多个用户生成发票时不能复制发票号。如果它可能导致重复,我将很感激如何阻止任何重复发生的建议。
很多,谢谢,保罗答案 0 :(得分:1)
不知道这是否有用
begin tran
declare @nextInvoiceNumber int = dbo.NextInvoiceNumber(@Prefix)
INSERT INTO [Invoice]
([InvoicedTo]
,[InvoiceNumber]
,[InvoiceDate]
,[Description]
,[Amount])
VALUES
(@InvoicedTo
,@nextInvoiceNumber
,@InvoiceDate
,@Description
,@Amount)
commit
您可以/应该做的另一件事是向表添加一个约束,要求它是唯一的。 然后添加错误处理,如果发生这种情况,只会得到另一个数字。
答案 1 :(得分:0)
不,它不能保证唯一性。
您应该将呼叫包裹在serializable transaction
。
答案 2 :(得分:0)
您需要将插入脚本嵌入到具有适当isolation level的事务(Begin和Commit / Rollback)中。