SQL Server - Identity auf bestehende Spalten?
-
Hallo,
ich habe einige Tabellen aus einem anderen DBS in den SQL Server 2008 inhaltlich übertragen. Jetzt hatten bestimmte Tabellen Autowert/Identity Spalten und das müsste ich auf dem SQL Server wieder reaktivieren. Leider hatte ich bisher keinen Erfolg, da es scheinbar nicht vorgesehen ist nachträglich die Funktion zu aktivieren.
Geht das trotzdem irgendwie ohne die bestehenden Spaltenwerte zu verlieren?
Grüße
-
Hallo,
geht meines Wissens nach nur über das Erstellen einer "Hilfs-Tabelle" mit den gleichen Feldern, nur dass man dort für die betreffende Spalte Identity festlegt, dann alle Datensätze der von dir schon erzeugten Tabelle einfügt (dabei vorher IDENTITY_INSERT auf ON setzen, damit das Eintragen überhaupt erlaubt ist), und danach IDENTITY_INSERT wieder auf OFF stellt, damit die ursprüngliche "Autowert-Funktion" wieder eingeschaltet wird, dann noch Löschen der "alten" Tabelle, und Umbenennen der "Hilfs-Tabelle" in den eigentlich vorgesehenen Namen. Das musst du dann wohl für jede Tabelle machen...
MfG,
Probe-Nutzer
-
Hi,
das ist natürlich nicht so toll
Ich habe mir eine zweite Tabelle erzeugt die identisch zur ersten ist und dort die betroffene Spalte mit Identity versehen. Dann wollte ich folgendes Statment ausführen:
set identity_insert tabelle2 on insert into [db].[dbo].[tabelle2] ( [Spalte1] ,[Spalte2] ) select [Spalte1] ,[Spalte2] from [db].[dbo].[tabelle] set identity_insert tabelle2 off
Edit:
Scheinbar hing die Anzeige im Management Studio, weshalb die Tabellen nicht erkannt wurden Ich konnte die Anweisung jetzt ausführen.Bekomme aber das hier:
Meldung 515, Ebene 16, Status 2, Zeile 3
Der Wert NULL kann in die Spalte1-Spalte, db.dbo.tabelle2-Tabelle nicht eingefügt werden. Die Spalte lässt NULL-Werte nicht zu. Fehler bei INSERT.
Die Anweisung wurde beendet.Ich hab im Orginal geschaut aber da ist jedes Feld ausgefüllt für die betroffene Spalte, die gleichzeitig die alte Identity beinhaltete.
Grüße
-
Die "IDENTITY" Eigenschaft kannst du einfach im Table-Designer dazuklicken (Column-Properties - Identity Specification), kein Grund eine neue Tabelle anzulegen.
Den Startwert kannst du dann auch festlegen (du wirst ja vermutlich nicht bei 1 anfangen wollen).
-
Ich glaub ich weiß woher das Problem kommt, die bestehende Identity Spalte ist nicht durchgehend, dh. da sind Lücken zwischen dem Anfangs- und Endwert, und vermutlich erwartet der SQL Server eine Lückenlose Spalte
-
Nö, Lücken sind wurscht, es dürfen nur keine Duplikate sein.
Lücken macht MSSQL sogar immer wieder selbst, nämlich wenn eine Transaktion abgebrochen wird oder schief geht und vor dem Abbruch ein INSERT in eine Tabelle mit IDENTITY Spalte gemacht wurde -- der IDENTITY wird beim Rollback nämlich nicht zurückgesetzt.
(Ginge auch gar nicht, es sei denn man würde alles immer überall mit Isolation Mode "serializable" machen, was unpraktikabel ist)
-
Dann verstehe ich aber nicht wieso das nicht geht. Die Spalte hat definitiv keine NULL Werte die Beginnt halt nicht bei 1 sondern bei 390 und hat dann eben immer mal wieder Lücken bis zum Endwert.
Ich hab auch mal probiert, "update tabelle set spalte1=spalte" ging auch nicht, da ich erst dachte es reicht in der tabelle eine neue identity spalte anzulegen und die dann mit den werten zu füllen.
-
Was bekommst du denn für eine Fehlermeldung wenn du die Spalte einfach im grafischen Table-Designer des Management Studio auf "Identity Specification = yes" umstellst und dann Save drückst?
Achso ja... am Datentyp (nur Integer-Typen erlaubt) bzw. daran dass es schon eine andere IDENTITY Column gibt wird es ja hoffentlich nicht liegen.
-
Hi,
ich habe den "Fehler" gefunden, da meine Spalte nicht bei 1 losgeht aber ohne genauere Definition bei 1 begonnen wird entstehen beim Einfügen für den SQL Server sogesehen "NULL Werte". Gebe ich jetzt einen Startwert vor, was der kleinste Wert in der bisherigen Spalte wäre klappt das auf einmal und Lücken zwischendrin sind dann auch egal
Jedoch muss ich die Tabellen neuerzeugen und über den Insert Befehl befüllen.
-
Also erstmal schön dass es jetzt geht.
Es geht aber definitiv auch einfacher. Hab ich schon zigfach gemacht. Alles kein Ding.
Beschrieben wie hab ich ja schon.Von daher wundert es mich dass es bei dir nicht klappen wollte. Alles sehr mysteriös