Microsoft SQL Server 2012 新的身份跳转功能如何处理数据类型的范围?

How new Identity Jump feature of Microsoft SQL Server 2012 handles the range of data type?

我以为这是一个错误,但在阅读这篇文章后 http://www.codeproject.com/Tips/668042/SQL-Server-2012-Auto-Identity-Column-Value-Jump-Is,我发现这是 SQL Server 2012 的新功能。

此功能会自动将您的最后一个标识列值增加 1000(整数)新行(10000 大整数)。

我仍在尝试文章中给出的解决方案,但如果此跳转发生在客户端,我不会有任何问题。因为我正在向客户展示 ID 的散列版本。是他自己的要求,不是我的。

但我想知道如果这些标识列的值超出数据类型(int 或 bigint)的范围怎么办?它如何处理列的范围和大小?

现有标识列将失败并显示 "Server: Msg 8115, Level 16, State 1, Line 2 Arithmetic overflow error converting IDENTITY to data type int. Arithmetic overflow occurred." 请参阅 http://www.sql-server-performance.com/2006/identity-integer-scope/ 进行讨论。

没有理由怀疑 Identity Jump 会有不同的行为。我不希望它去寻找较早序列中未使用的身份。

为什么不在 MS Server 2012 中使用 Sequence。

Sequence 的示例代码如下,创建 Sequence 不需要 ADMIN 权限。

CREATE SEQUENCE SerialNumber AS BIGINT
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9999999
CYCLE;
GO

如果您需要将前导“0”添加到序列中,那么只需使用以下代码即可:

RIGHT ('0000' + CAST (NEXT VALUE FOR SerialNumber AS VARCHAR(5)), 4) AS SerialNumber 

此问题已在 SQL 服务器更新的最新版本中得到修复。这是一个错误。

如果您仍想使用相同的版本,则必须每隔一段时间检查您的身份,如果它们的值超过 1000 秒,则用当前身份重新播种。

此脚本可以帮助您了解种子值、增量值和当前标识列值 http://blog.sqlauthority.com/2014/08/29/sql-server-query-to-find-seed-values-increment-values-and-current-identity-column-value-of-the-table-with-max-value-of-datatype-part-2/

我的建议:应用重新发送的补丁、CU 或服务包。