在表格中插入发票编号(无间隙)的最佳方法是什么

时间:2019-01-03 08:54:47

标签: sql sql-server database sql-server-2008

我正在使用SQL Server(版本2008和2012)进行销售项目。我需要将销售数据插入表中并为该数据创建发票编号。为此,我将invoiceNumber列设置为一个标识列,该列递增1。

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

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

INSERT INTO SalesTable(InvoiceNumber, col1, col2) 
VALUES ((SELECT MAX(SalesId) FROM SalesTable + 1), value1, value2)

如果我的软件可以在单台计算机上运行,​​这可能会正常工作。

我的问题是,如果我在多个用户同时创建销售发票的软件中使用此代码,那么两个发票是否有可能获得相同的发票编号?我是说发票号码重复吗?

在插入数据之前使用表上的锁是否可以防止此问题?如果是,该怎么办?与使用锁相关的问题是什么?

我找到了类似的问题,但没有找到最佳解决方案。

在此方面的任何帮助将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:4)

您可以使用通过NO_CACHE选项创建的SEQUENCES,但这不能保证由于应用程序中的错误而造成的空白。

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

答案 1 :(得分:0)

您可以尝试在Sql服务器中使用一列的identity属性来获取具有您提供的序列的自动递增编号,例如1。该编号可以与诸如INV001,INV002等的某些前缀组合。

您可以在此处了解有关SQL Server中的身份的信息-IDENITY