在插入语句中使用SQL函数

时间:2014-05-09 14:40:18

标签: sql sql-server function

我的数据库中有一张发票表,其中插入了新发票。最近我们升级了我们的服务,并且有许多用户将发票插入表中。我编写了一个函数来计算序列中的下一个发票号(序列不仅仅是顺序编号)。

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语句可以保证在多个用户生成发票时不能复制发票号。如果它可能导致重复,我将很感激如何阻止任何重复发生的建议。

很多,谢谢,保罗

3 个答案:

答案 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)中。