6

Myślałem, że to był błąd, ale po przeczytaniu tego artykułu http://www.codeproject.com/Tips/668042/SQL-Server-2012-Auto-Identity-Column-Value-Jump-Is, stwierdziliśmy, że jest to nowa funkcja programu SQL Server 2012.Jak nowa funkcja Identity Jump w Microsoft SQL Server 2012 obsługuje zakres typów danych?

Funkcja ta zwiększa swoją ostatnią wartość kolumny tożsamości przez 1000 (int) dla nowych wierszy (10000 dla bigints) automatycznie.

enter image description here

Nadal staram rozwiązanie podane w artykule, ale nie mam żadnego problemu, jeśli ten skok dzieje się po stronie klienta. Ponieważ wyświetlam klientowi ukrytą wersję identyfikatorów. To jego własne żądanie, nie moje.

Ale zastanawiam się, co się stanie, jeśli wartości tych kolumn tożsamości będą większe niż zakres typu danych (int lub bigint)? Jak radzi sobie z zakresem i rozmiarem kolumny?

+2

Rozwiązanie w artykule jest bardzo proste i zajmuje 5 min. Zastosowałem rozwiązanie * -t272 * i działa dobrze. –

Odpowiedz

4

Istniejące kolumny tożsamości zakończą się niepowodzeniem z komunikatem "Serwer: Msg 8115, poziom 16, stan 1, linia 2 błąd arytmetyczny konwersji TOŻSAMOŚCI na typ danych int. Wystąpiło przepełnienie arytmetyczne." Zobacz dyskusję na temat http://www.sql-server-performance.com/2006/identity-integer-scope/.

Nie ma powodu, aby podejrzewać, że Identity Jump będzie miało inne zachowanie. Nie chciałbym, żeby szedł i szukał nieużywanych tożsamości we wcześniejszej sekwencji.

+0

Dzięki temu linkowi i http://stackoverflow.com/questions/13132939/what-happens-when-i-exex--bigint-generated-key-how-to-handle-it usuwa to zamieszanie. Chociaż jest to mysql pytanie, ale to ma sens. Jeśli dodam wartości stopniowo począwszy od zera, to zajmie to 300 milionów lat i 67 108,863 terabajtów wolnej przestrzeni. Ponieważ max bigint to 9223372036854775807.At 1000 insertów/sekundę to 106751991167 dni. Prawie 300 milionów lat, jak wyjaśniono przez @ CraigRinger. Jedynym problemem jest wstawienie maksymalnego limitu.Ale jak napisano w artykule, spowoduje to zwiększenie błędu. –

2

Dlaczego nie używacie Sequence w MS Server 2012.

Przykładowy kod sekwencja będzie w następujący sposób i nie trzeba pozwolenia ADMIN do tworzenia sekwencji.

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

W przypadku, jeśli trzeba dodać wiodącym „0” do sekwencji następnie proste zrobić to z następującego kodu:

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

Problem został rozwiązany w najnowszej wersji aktualizacji programu SQL Server. To był błąd.

Jeśli nadal chcesz korzystać z tej samej wersji, będziesz musiał sprawdzić tożsamość w odstępach czasu i ponownie przydzielić ją z aktualną tożsamością, jeśli przekroczyła ona wartość 1000.

Ten skrypt może pomóc poznać wartości początkowe wartości inkrementacji i bieżącej tożsamości kolumnie Wartość 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/

Moja sugestia: Zastosuj Resent łatek, Cu lub dodatku Service Pack.

+4

Czy można utworzyć łącze do dowolnej dokumentacji dotyczącej tej poprawki? Nie widzę żadnych ostatnich aktualizacji elementu połączenia tutaj https://connect.microsoft.com/SQLServer/feedback/details/739013/failover-lub-restart-results-in-reseed-of-identity, chociaż mówi problem z wyłączaniem menedżera sterowania zostanie rozwiązany w pewnym momencie. –

+5

Jaki problem został dokładnie rozwiązany, nie rozumiem. –

Powiązane problemy