SQL Server: Maximaler Wert für IDENTITY Spalte erreicht.

Auf einem SQL-Server ist beim Versuch einen Datensatz in eine Tabelle einzufügen folgender Fehler aufgetreten:

Arithmetic overflow error converting IDENTITY to data type int.

Die Ursache hierür ist realtiv einfach zu finden.

Der Identity-Wert der eingefügt werden soll ist größer als der Datentyp der Identity-Spalte es zulassen würde. Hat man also als Datentyp für die Identity-Spalte einen INT(4) gewählt, dann ist bei 2147483647 Schluß. Werden Datensätze aus einer Tabelle gelöscht und damit Identity-Werte „frei“, so werden diese nicht wieder verwendet. Der Identity-Wert ist immer aufsteigend und eindeutig.

Hier eine kleine SQL-Abfrage, daß alle Tabellen, die Identity-Spalte und deren aktuellen Identity-Wert auflistet.

SELECT SO.name As sTableName
     , SC.name AS sIdentityColumn
     , IDENT_CURRENT( SO.name ) AS nCurrentIdentValue
 FROM syscolumns SC, sysobjects SO
 WHERE SO.type = 'U' AND SO.id = SC.id AND SC.status = 0x80
 ORDER BY nCurrentIdentValue DESC

Hier ein Beispiel für das Ergebnis obiger SQL-Abfrage:

sTableName                 sIdentityColumn          nCurrentIdentValue
-------------------------- ------------------------ -------------------
tblIOS_StepValues          UID_StepValue            2501808
tblIOS_StepLogs            UID_StepLog              659085
tblIOS_ConsumptionReport   UID_ConsumptionReport    165321
tblIOS_DBaseFiles          UID_DBaseFile            29349
tblIOS_BasicOperations     UID_BasicOperation       352
tblIOS_PlantUsage_Defs     UID_PlantUsageDef        323
tblIOS_ValueNames          UID_ValueName            312
tblIOS_PlantUsage_Groups   UID_PlantUsageDef        213
tblIOS_Recipes             UID_Recipe               77
tblIOS_PlantSections       UID_PlantSection         58
tblIOS_Components          UID_Component            38
tblIOS_ValueDimensions     UID_ValueDimension       31
tblIOS_ImporterConfigs     UID_ImporterConfig       6
tblIOS_PLCs                UID_PLC                  4
tblIOS_RecipeTypes         UID_RecipeType           4

Achtung! Auf einem SQL-Server 2000 liefert IDENT_CURRENT() immer einen Wert für eine Tabelle mit Identity-Spalte zurück.

In einem SQL-Server 2005 nur dann, wenn der Aufrufer auch das Recht hat die Metadaten der Tabelle lesen zu dürfen. Fehlen einem Aufrufer diese Rechte, dann liefert die Funktion NULL zurück.

Siehe dazu den Blogbeitrag IDENT_CURRENT() Behavior Change In SQL Server 2005 von Ward Pond.

Noch eine Bemerkung am Rande. Vielleicht sollte man der Ursache auf den Grund gehen, wenn in einer Datenbanktabelle mehr als 2 Millarden (!) Datensätze enthalten sind/waren.

Kommentare 1

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.