Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

„Arithmetischer Überlauffehler beim Konvertieren von IDENTITY in Datentyp…“ in SQL Server behoben

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.