6

Tôi nghĩ đó là lỗi nhưng sau khi đọc bài viết này http://www.codeproject.com/Tips/668042/SQL-Server-2012-Auto-Identity-Column-Value-Jump-Is, tôi thấy rằng đó là một tính năng mới của SQL Server 2012.Tính năng Chuyển đổi danh tính mới của Microsoft SQL Server 2012 xử lý phạm vi loại dữ liệu như thế nào?

Tính năng này tăng giá trị cột nhận dạng cuối cùng của bạn lên 1000 (int) cho hàng mới (10000 cho bigints) tự động.

enter image description here

tôi vẫn đang cố gắng giải pháp được đưa ra trong bài báo nhưng tôi không có bất kỳ vấn đề nếu nhảy này xảy ra tại phía khách hàng. Bởi vì tôi đang hiển thị phiên bản băm của ID cho khách hàng. Đó là nhu cầu của riêng mình không phải của tôi.

Nhưng tôi tự hỏi điều gì sẽ xảy ra nếu giá trị của các cột nhận dạng này vượt quá phạm vi của kiểu dữ liệu (int hoặc bigint)? Làm thế nào nó xử lý phạm vi và kích thước của cột?

+2

Giải pháp trong bài viết rất đơn giản và mất 5 phút. Tôi đã áp dụng giải pháp * -t272 * và nó hoạt động tốt. –

Trả lời

4

Cột danh tính hiện tại sẽ không thành công với lỗi tràn "Số máy chủ: Msg 8115, Cấp 16, Tiểu bang 1, Dòng 2 số học chuyển đổi IDENTITY thành loại dữ liệu int. Đã xảy ra tràn số học." Xem http://www.sql-server-performance.com/2006/identity-integer-scope/ để thảo luận.

Không có lý do gì để nghi ngờ rằng Chuyển đổi danh tính sẽ có hành vi khác. Tôi không muốn nó đi và săn tìm những danh tính không được sử dụng trong một trình tự trước đó.

+0

Cảm ơn liên kết đó và http://stackoverflow.com/questions/13132939/what-happens-when-i-exhaust-a-bigint-generated-key-how-to-handle-it xóa sự nhầm lẫn. Mặc dù đó là mysql câu hỏi nhưng nó làm cho một điểm. Nếu tôi thêm các giá trị gia tăng bắt đầu từ số không thì nó sẽ mất 300 triệu năm và 67,108,863 terabyte không gian trống. Bởi vì bigint tối đa là 9223372036854775807.Thêm 1000 lần chèn/giây là 106751991167 ngày trị giá. Gần 300 triệu năm như được giải thích bởi @ CraigRinger. Vấn đề duy nhất là khi bạn chèn giới hạn tối đa.Nhưng khi bài viết của bạn cho biết sẽ làm tăng lỗi. –

2

Tại sao bạn không sử dụng Trình tự trong MS Server 2012.

Mã mẫu Đối với chuỗi sẽ như sau và bạn không cần ADMIN cho phép tạo trình tự.

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

Trong trường hợp nếu bạn cần phải thêm phần đầu '0' để chuỗi sau đó đơn giản làm điều đó với đoạn mã sau:

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

Vấn đề này đã được cố định trong phiên bản mới nhất của các bản cập nhật SQL Server. Đó là một lỗi.

Nếu bạn vẫn muốn sử dụng cùng một phiên bản, bạn sẽ phải kiểm tra danh tính của mình trong khoảng thời gian và đặt lại thông tin nhận dạng hiện tại nếu chúng đã tăng hơn 1000 giá trị.

Kịch bản này có thể giúp bạn biết giá trị hạt giống, giá trị Tăng và hiện nhận dạng cột Value 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/

Đề nghị của tôi: Áp dụng các bản vá lỗi gửi lại, CU hoặc gói dịch vụ.

+4

Bạn có thể liên kết với bất kỳ tài liệu nào về bản sửa lỗi này không? Tôi không thấy bất kỳ cập nhật gần đây nào cho mục kết nối tại đây https://connect.microsoft.com/SQLServer/feedback/details/739013/failover-or-restart-results-in-reseed-of-identity mặc dù nó nói vấn đề với việc tắt trình quản lý kiểm soát sẽ được giải quyết tại một số điểm. –

+5

Vấn đề đã được sửa chữa chính xác, tôi không hiểu. –

Các vấn đề liên quan