将发票号码(没有任何间隙)插入表格的最佳方法是什么

Ade*_*dan 1 sql database sql-server sql-server-2008

我正在使用 SQL Server(版本 2008 和 2012)开展一个销售项目。我需要将销售数据插入表中并为该数据创建发票号码。invoiceNumber我通过将我的列设置为身份列并递增一来完成此操作。

但是现在,我们有一个要求,我们的发票号码之间不能有间隙(除非发票被删除。删除的发票将存储在单独的表中)。

当交易失败时,身份列将丢失发票号码。从 SQL Server 2012 开始,服务器重新启动时它可能会增加 1000。为了摆脱这个问题,我被迫使用INSERT SELECT如下所示的语句

INSERT INTO SalesTable(InvoiceNumber, col1, col2) 
VALUES ((SELECT MAX(SalesId) FROM SalesTable + 1), value1, value2)
Run Code Online (Sandbox Code Playgroud)

如果我的软件在单台机器上运行,这可能会很好地工作。

我的问题是,如果我在多个用户同时创建销售发票的软件中使用此代码,两张发票是否有机会获得相同的发票编号?我的意思是发票号码重复?

在插入数据之前在表上使用锁会阻止该问题吗?如果是的话怎么办?使用锁会带来哪些问题?

我发现了类似的问题,但没有找到以最佳方式解决此问题的答案。

对此的任何帮助将不胜感激。谢谢。

And*_*lov 5

您可以使用通过选项创建的序列NO_CACHE,但这不能保证您的应用程序中不会出现由于错误而导致的间隙。

作为一般建议,以“草稿”状态创建发票,其中所有内容都保存在数据库中并提交。然后通过生成发票编号来“最终确定”这些发票。

  • 的确。但你没有提到使用哪个版本的SQL Server。而且 2008 年将在几个月内失去支持,因此您无论如何都应该考虑停止使用它。当然,您也可以通过正确选择锁定和事务隔离级别来实现这一点。也许使用单独的“计数器”表来存储每年的数字。 (3认同)