Wenn Sie den Fehler „Msg 8115, Level 16 Arithmetic overflow error converting IDENTITY to data type… ”-Fehler in SQL Server, liegt dies wahrscheinlich daran, dass Sie versuchen, Daten in eine Tabelle einzufügen, wenn deren IDENTITY
Spalte hat das Limit ihres Datentyps erreicht.
Eine IDENTITY
Spalte erhöht automatisch den Wert, der mit jeder neuen Zeile eingefügt wird. Wenn der eingefügte Wert außerhalb des Bereichs des Datentyps der Spalte liegt, tritt der obige Fehler auf.
Beispiel für den Fehler
Hier ist ein Codebeispiel, das zu dem Fehler führt:
INSERT INTO t1 VALUES ('Dog');
Ergebnis:
Msg 8115, Level 16, State 1, Line 1 Arithmetic overflow error converting IDENTITY to data type tinyint.
In diesem Fall meine IDENTITY
Spalte verwendet den tinyint
Datentyp, der einen Bereich von 0 bis 255 hat. Der Fehler impliziert, dass die IDENTITY
Spalte versucht, einen Wert einzufügen, der höher als 255 ist.
Dies tritt normalerweise auf, wenn wir bereits 255 Zeilen in die Spalte eingefügt haben und jetzt versuchen, die 256. Zeile einzufügen.
So sieht meine Tabelle aus, wenn ich alle Zeilen auswähle, in denen IDENTITY
Spalte ist größer als 250
:
SELECT * FROM t1
WHERE c1 > 250;
Ergebnis:
+------+------+ | c1 | c2 | |------+------| | 251 | Ant | | 252 | Cow | | 253 | Bat | | 254 | Duck | | 255 | Bull | +------+------+
In diesem Fall c1
ist meine IDENTITY
Spalte (die zufällig vom Typ tinyint
ist ). Wir können diese IDENTITY
sehen hat zuvor 255
generiert für die Spalte, und so ist der nächste einzufügende Wert 256
(unter der Annahme eines Inkrementwertes von 1
und keine zuvor fehlgeschlagenen Einfügungen). Dies wird den obigen Fehler verursachen, da 256 außerhalb des Bereichs von tinyint
liegt .
Dasselbe Problem kann bei Datentypen von smallint
auftreten (Maximalwert 32.767) oder int
(Maximalwert von 2.147.483.647). Es könnte auch mit bigint
passieren wenn Sie genügend Zeilen eingefügt haben (über 9.223.372.036.854.775.807).
Die IDENTITY
Der Wert stimmt nicht immer mit der Anzahl der eingefügten Zeilen überein. Sie können beim Erstellen einer IDENTITY
einen Startwert festlegen Spalte, und Sie können auch einen Inkrementwert festlegen. Daher könnten Sie je nach Seed- und Inkrementwerten leicht die Obergrenze viel früher erreichen als die Anzahl der am Tisch durchgeführten Einfügungen.
Außerdem wird durch das Löschen von Zeilen aus einer Tabelle die IDENTITY
nicht zurückgesetzt value (obwohl das Abschneiden einer Tabelle dies tut).
Daher kann der obige Fehler auch dann auftreten, wenn die Tabelle weit weniger Zeilen enthält als IDENTITY
der Datentyp der Spalte könnte vorschlagen.
Lösung
Eine Lösung besteht darin, den Datentyp der IDENTITY
zu ändern Säule. Zum Beispiel, wenn es smallint
ist , ändern Sie es in int
. Oder wenn es bereits int
ist , ändern Sie es in bigint
.
Eine andere mögliche Lösung wäre, die IDENTITY
zurückzusetzen Seed auf einen niedrigeren Wert. Dies würde nur funktionieren, wenn Sie entweder viele Zeilen aus der Tabelle gelöscht haben oder wenn der ursprüngliche Seed-Wert viel höher als 1
war .
Wenn zum Beispiel die IDENTITY
Spalte ist bereits ein int
, aber die IDENTITY
Seed begann bei sagen wir 2,000,000,000
, könnten Sie die IDENTITY
zurücksetzen Seed auf 1
, wodurch weitere 2 Milliarden Zeilen eingefügt werden könnten.
Hilfreiche Funktionen
Hier sind einige Funktionen, die bei der Identifizierung dieses Problems sehr hilfreich sein können:
IDENT_CURRENT()
– gibt den letzten Identitätswert zurück, der für eine angegebene Tabelle oder Ansicht in einer Identitätsspalte generiert wurde.@@IDENTITY
– Gibt den zuletzt eingefügten Identitätswert in der aktuellen Sitzung zurück.IDENT_SEED()
– Gibt den ursprünglichen Seed einer Identitätsspalte zurück.IDENT_INCR()
– Gibt den Inkrementwert einer Identitätsspalte zurück.
Außerdem finden Sie hier 3 Möglichkeiten, den Datentyp einer Spalte abzurufen, falls Sie sich nicht sicher sind, um welchen Datentyp es sich bei der Spalte handelt.
Gleicher Fehler in verschiedenen Szenarien
Derselbe Fehler (Msg 8115) kann auch auftreten (mit einer etwas anderen Fehlermeldung), wenn Sie versuchen, explizit zwischen Datentypen zu konvertieren, und der ursprüngliche Wert außerhalb des Bereichs des neuen Typs liegt. Siehe „Arithmetischer Überlauffehler beim Konvertieren von int in den numerischen Datentyp“ in SQL Server beheben, um dies zu beheben.
Es kann auch auftreten, wenn Sie eine Funktion wie SUM()
verwenden in einer Spalte, und die Berechnung ergibt einen Wert, der außerhalb des Bereichs des Spaltentyps liegt. Siehe „Arithmetischer Überlauffehler beim Konvertieren des Ausdrucks in den Datentyp int“ in SQL Server beheben, um dies zu beheben.