Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL数字列禁止空白_C#_Sql_Sql Server_Azure Sql Database - Fatal编程技术网

C# SQL数字列禁止空白

C# SQL数字列禁止空白,c#,sql,sql-server,azure-sql-database,C#,Sql,Sql Server,Azure Sql Database,我正在数据库中创建发票表。我需要一个整数列来存储发票号。此列必须禁止数字之间的间隙。标识不起作用,因为回滚时会产生间隙 所以我想要的是: InvoiceId(Primary key identity) InvoiceNumber(Unique, NOT NUll) 1 1 2 2 10

我正在数据库中创建发票表。我需要一个整数列来存储发票号。此列必须禁止数字之间的间隙。标识不起作用,因为回滚时会产生间隙

所以我想要的是:

InvoiceId(Primary key identity)     InvoiceNumber(Unique, NOT NUll)
      1                                      1
      2                                      2
      10                                     3
      13                                     4
sql中有没有一种特殊的方法来实现这一点? 如果sql中没有解决方案,我应该如何在c#+实体中实现它

编辑1: 附加信息:永远不会删除行

编辑2:
为什么我需要无间隙专栏:这是法律要求(法国法律)。发票编号为无间隙,表示您没有删除发票。

因为有多个用户,您无法在客户端重新计算值。只需在数据库中为insert/delete创建触发器,该触发器将重新计算整个表的InvoiceNumber。

如果并行访问数据库,则无法防止出现漏洞

简单案例:

  • 流程A)创建发票。(#1)
  • 流程B)创建发票。(#2)
  • 流程A)回滚其事务
  • 差距
  • 您可以为整个事务锁定整个表。这意味着只有一个流程可以同时创建发票。对于一个人手工创建所有发票的小公司来说,这可能是可以接受的

    或者,您可以将该列留空,每晚锁定整个表一次,并写入尚未设置的数字。这意味着您可以在以后的发票处理过程中获得发票号,但它没有间隙


    或者,您可以再次阅读需求。德国也有一些同样愚蠢的东西,但它只是想把这些数字写在税务部门的表格上。因此,您可以使用带有间隙的普通发票号码,当将它们发送给这个官僚怪物时,您将仅在出口时生成一个唯一的、无间隙的号码。

    因此列不允许间隙,但您的业务流程允许间隙?什么是差距?像一个空值,例如。。。1,2,NULL,3,4?如果不允许存在间隙,实际上会删除多个连接的可用性。您准备好为所有应用程序使用到此数据库的单一连接了吗?@RohanBüchner Gap为1,2,5,6,7。这不是一个空问题。列不为空。如果没有间隙,那么我们可以假设从未发生删除?在这种情况下,您只需在标识列上运行一个
    ROW_NUMBER()
    ,并相信结果将是稳定的(因为不会发生删除),因此(不必)存储此值(但您当然可以选择这样做)。请解释此要求,使其具有无间隙
    InvoiceNumber
    s。我已经编写了很多发票系统,从来没有遇到过这个要求。你的处境有什么特别之处?