首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在SQL Server中获取完全连续的int值的最佳方法

在SQL Server中获取完全连续的int值的最佳方法
EN

Stack Overflow用户
提问于 2011-04-04 19:03:16
回答 3查看 1.7K关注 0票数 1

我有一个业务需求,即我的Invoices表中的InvoiceNumber字段必须是完全连续的-没有空格,否则审计人员可能会认为我们的会计人员在做一些可疑的事情!

我的第一个想法是简单地使用主键(标识),但是如果回滚一个事务,序列中就会出现一个间隙。

因此,我的第二个想法是使用触发器,它在插入时在表中查找最高的InvoiceNumber值,将其加1,并将其用作新行的InvoiceNumber。易于实现。

几乎同时插入是否存在潜在问题?例如,两个几乎同时运行触发器的插入是否会获得相同的‘当前最高InvoiceNumber’值,从而插入具有相同InvoiceNumber的行

还有其他我可能遗漏的问题吗?另一种方法会更好吗?

EN

回答 3

Stack Overflow用户

发布于 2011-04-04 19:07:39

创建一个跟踪“计数器”的表。对于您的发票,您可以向该表添加一些记录,以跟踪必须使用的下一个整数。

在创建发票时,您应该使用该值并增加该值。回滚事务时,对该计数器的更新也将回滚。(确保您在该表上设置了锁,以确保没有其他进程可以使用相同的值)。

这比查看发票表中使用的最高当前计数器要可靠得多。

票数 0
EN

Stack Overflow用户

发布于 2011-04-04 19:08:12

代码语言:javascript
运行
复制
CREATE TABLE dbo.Sequence(
 val int 
 )

插入具有初始种子的行。然后为插入分配足够大小的范围(显然是在同一事务中调用它)

代码语言:javascript
运行
复制
CREATE PROC dbo.GetSequence
@val AS int OUTPUT,
@n as int =1
AS
UPDATE dbo.Sequence 
SET @val = val = val + @n;

SET @val = @val - @n + 1; 

这将阻止其他并发尝试递增序列,直到第一个事务提交为止。

票数 0
EN

Stack Overflow用户

发布于 2011-04-04 19:08:29

如果从表中删除数据,您可能仍然会得到差距。但是,如果数据只进不出,那么通过正确使用外部顺序表上的事务,应该可以很好地做到这一点。不要使用MAX()+1,因为它可能会有计时问题,或者您可能不得不锁定比所需更多的表(页面/表)。

一个只有一条记录和一列的顺序表。以原子方式从表中检索数字,将检索和使用包装在单个事务中。

代码语言:javascript
运行
复制
begin tran
declare @next int
update seqn_for_invoice set @next=next=next+1
insert invoice (invoicenumber,...) value (@next, ....)
commit

UPDATE语句是原子性的,不能被中断,双重赋值使@next的值成为原子性的。它等效于在SQL Server 2005+中使用OUTPUT子句返回更新后的值。如果您需要一系列的数字,那么使用更新前的值比更新后的值更容易,例如

代码语言:javascript
运行
复制
begin tran
declare @next int
update seqn_for_invoice set @next=next, next=next+3   -- 3 in one go
insert invoice (invoicenumber,...) value (@next, ....)
insert invoice (invoicenumber,...) value (@next+1, ....)
insert invoice (invoicenumber,...) value (@next+2, ....)
commit

SQL Server UPDATE statement参考

表达式SET @variable = column =

将变量设置为与列相同的值。这与SET @variable = column,column = expression不同,后者将变量设置为列更新前的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5537549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档