在Insert语句中使用SQL函数

在Insert语句中使用SQL函数,sql,sql-server,function,Sql,Sql Server,Function,我的数据库中有一个发票表,其中插入了新发票。最近,我们升级了服务,许多用户将发票插入表中。我编写了一个函数,用于计算序列中的下一个发票编号(序列不仅仅是序列编号) 我现在想在insert语句中使用这个函数,如下所示 INSERT INTO [Invoice] ([InvoicedTo] ,[InvoiceNumber] ,[InvoiceDate] ,[Description] ,[Amount]) VALUES (@InvoicedTo ,NextInvoiceNumber(@Pre

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

我现在想在insert语句中使用这个函数,如下所示

INSERT INTO [Invoice]
([InvoicedTo]
 ,[InvoiceNumber]
 ,[InvoiceDate]
 ,[Description]
 ,[Amount])
VALUES
(@InvoicedTo
 ,NextInvoiceNumber(@Prefix)
 ,@InvoiceDate
 ,@Description
 ,@Amount)
我想确保的是,使用此insert语句将确保在多个用户生成发票时,发票编号不会重复。如果它可以导致重复,我将感谢如何阻止任何重复发生的建议


非常感谢,保罗不,它不能保证独一无二


您应该将调用包装在一个可序列化的事务中。您需要在事务中嵌入插入脚本(开始和提交/回滚),并使用适当的参数。

不知道这是否有用

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

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

commit
您可以/应该做的另一件事是向表中添加一个要求它唯一的约束。 然后在发生这种情况时添加错误处理,这将为您提供另一个号码

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

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

commit