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 nCurrentIdentValueFROM syscolumns SC, sysobjects SOWHERE SO.type = 'U' AND SO.id = SC.id AND SC.status = 0x80ORDER BY nCurrentIdentValue DESC
Hier ein Beispiel für das Ergebnis obiger SQL-Abfrage:
sTableName sIdentityColumn nCurrentIdentValue-------------------------- ------------------------ -------------------tblIOS_StepValues UID_StepValue 2501808tblIOS_StepLogs UID_StepLog 659085tblIOS_ConsumptionReport UID_ConsumptionReport 165321tblIOS_DBaseFiles UID_DBaseFile 29349tblIOS_BasicOperations UID_BasicOperation 352tblIOS_PlantUsage_Defs UID_PlantUsageDef 323tblIOS_ValueNames UID_ValueName 312tblIOS_PlantUsage_Groups UID_PlantUsageDef 213tblIOS_Recipes UID_Recipe 77tblIOS_PlantSections UID_PlantSection 58tblIOS_Components UID_Component 38tblIOS_ValueDimensions UID_ValueDimension 31tblIOS_ImporterConfigs UID_ImporterConfig 6tblIOS_PLCs UID_PLC 4tblIOS_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.
Da fragt man sich beim Überfliegen schon, ob man selbst nicht komplett auf den Kopf gefallen ist. Dankeschön für Ihre Einsichten