【问题标题】:SQL next bigInt for InvoiceID in multiple tablesSQL next bigInt for InvoiceID 在多个表中
【发布时间】:2014-12-17 07:51:37
【问题描述】:

我希望有人可以在这里帮助我, 我正在使用 SQL Server,使用 4 个表。

  • 发票
  • 发票行
  • 账本
  • 历史

每次我需要创建发票时,我还需要生成一个序列号,并通过使用事务(使用 wpf - vb.net ado.net Transactions)将其用于更新或插入其他表 所以换句话说,我需要知道下一个发票 ID 并能够将其用于其他表以进行插入/更新

请注意,它将在多台计算机上使用,因此发票 ID 在创建时不应与另一个发票 ID 冲突

我在这里和那里阅读了几个关于堆栈溢出的论坛,建议首先必须插入然后检索它,然后更新任何其他表。在我的情况下,如果一切正常,我需要它使用一个事务并提交它们很好

我还阅读了另一种方法,例如 SQL 可以生成数字序列

下一个值。如果出现问题,的下一个值将增加 1,并让失败的值落后。

谁能给我任何有用的链接或他自己的想法我该如何解决这个问题?

现在查询发票获取最大 InvoiceID 并在执行前几毫秒将其增加 1,因此正在消除有人可以获得相同发票 ID 但又不是 100% 正确的情况。

抱歉,描述太长了 任何帮助深表感谢。

【问题讨论】:

    标签: sql-server vb.net


    【解决方案1】:

    没有什么能阻止您插入 Invoice、读取新 ID 并插入事务中的其他表。

    如果您进行回滚,则不会重新发布身份值。如果您在 Sql Server 中使用 Sequence,这些号码也不会重新发出。

    如果你绝对需要一个完整的系列,你必须自己实现它。

    【讨论】:

    • 感谢您的回复 idstam ,我的要求是使用一个数字序列(不间断的系列)并在交易中使用它。
    【解决方案2】:

    可以使用sql server中的Sequence功能,类似于身份增量,调用下一个序列号可以得到

        CREATE SEQUENCE [dbo].[MyTable_Sequence] 
     AS [smallint]
     START WITH 1
     INCREMENT BY 1
     MINVALUE -32768
     MAXVALUE 32767
     CACHE 
    GO
    

    你可以使用

     NEXT VALUE FOR [SEQUENCE NAME]
    

    如果将其存储在如下参数中,则可以在范围内的任何位置使用该值

    DECLARE @ID SMALLINT
    
    SET @ID =   NEXT VALUE FOR [SEQUENCE NAME]
    

    参考此链接http://msdn.microsoft.com/en-IN/library/ff878091.aspx

    【讨论】:

    • hi mindbdev,我已经阅读了您的建议,我也用 sql 检查了 ti,但是这不起作用,因为 (next value for) 将始终增加 1 ,但如果我的记录无法插入由于任何原因成功地在表中,然后这个递增的数字,例如 1 下次将是 2,这与我的要求不符。如果该行失败,则下一个值仍应为 1 而不是 2。但同样,任何解决方案都应适用于多用户环境
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多