In een MS SQL Server tabel die gevuld is met data moet een primary key (dus uniek) worden toegevoegd met als datatype varchar. Het toevoegen van een extra kolom aan de tabel gaat prima. Het probleem is echter het vullen van deze kolom met een uniek id (hoeft niet globaal uniek te zijn).
Ik wil de oplossing graag uitvoeren in een SQL-script, dus niet met behulp van een applicatie of vbs(of zo) script.
Nu heb ik twee oplossingen bedacht, maar bij beiden loop ik vast
Methode 1: Voeg de kolom toe aan de tabel en vul voor alle records dat veld met een unieke waarde (bijvoorbeeld een opvolgend nummer).
Probleem: Hoe moet je in een sql-script per record een andere waarde invoeren?
Methode 2: Maak een nieuwe tabel met dezelfde structuur, voeg daaraan een kolom toe (type int) met 'IDENTITY' (en primary) gezet. Kopieer vervolgens de data uit de originele tabel naar de tweede tabel en het id-veld wordt dankzij 'identity' automatisch gemaakt.
Probleem: Hoe verwijder ik hierna het automatisch genereren van waarden door 'identity' en hoe verander ik het datatype van int naar varchar?
Als ik deze handelingen doe via de Enterprise Manager, gaat het goed, maar aangezien het voor 150+ tabellen moet gebeuren, doet ik dat liever met een script.
Het uitzetten van identity kan via
Het veranderen van het datatype levert de volgende foutmelding op:
Het verwijderen van de constraint voor de primary key kan wel, mits ik de naam daarvan weet. Die is op te halen met "EXEC sp_helpindex", maar hoe krijg ik de index_name dan in mijn remove-constraint query?
Als ik de constraint handmatig verwijder en daarna het veldtype aan pas, krijg ik de melding:
De identity flag is dus kennelijk nog niet weggehaald.
Het nogmaals kopieeren van alle data uit alle tabellen naar weer een nieuwe tabel kan natuurlijk ook... maar ik vind 1x alle data dupliceren al wel genoeg eigenlijk...
Kortom; hoe krijg ik het toevoegen van een id-kolom voor een primary key voor elkaar volgens (een van) bovenstaand (of andere) methode?
Ik wil de oplossing graag uitvoeren in een SQL-script, dus niet met behulp van een applicatie of vbs(of zo) script.
Nu heb ik twee oplossingen bedacht, maar bij beiden loop ik vast
Methode 1: Voeg de kolom toe aan de tabel en vul voor alle records dat veld met een unieke waarde (bijvoorbeeld een opvolgend nummer).
Probleem: Hoe moet je in een sql-script per record een andere waarde invoeren?
Methode 2: Maak een nieuwe tabel met dezelfde structuur, voeg daaraan een kolom toe (type int) met 'IDENTITY' (en primary) gezet. Kopieer vervolgens de data uit de originele tabel naar de tweede tabel en het id-veld wordt dankzij 'identity' automatisch gemaakt.
Probleem: Hoe verwijder ik hierna het automatisch genereren van waarden door 'identity' en hoe verander ik het datatype van int naar varchar?
Als ik deze handelingen doe via de Enterprise Manager, gaat het goed, maar aangezien het voor 150+ tabellen moet gebeuren, doet ik dat liever met een script.
Het uitzetten van identity kan via
code:
1
| SET IDENTITY_INSERT <tabelnaam> OFF |
Het veranderen van het datatype levert de volgende foutmelding op:
code:
1
2
3
| ALTER TABLE <tabelnaam> ALTER COLUMN <id-field> [varchar] (30) The object '<primary key identifier>' is dependent on column '<id-field>'. ALTER TABLE ALTER COLUMN <id-field> failed because one or more objects access this column. |
Het verwijderen van de constraint voor de primary key kan wel, mits ik de naam daarvan weet. Die is op te halen met "EXEC sp_helpindex", maar hoe krijg ik de index_name dan in mijn remove-constraint query?
Als ik de constraint handmatig verwijder en daarna het veldtype aan pas, krijg ik de melding:
code:
1
2
| Identity column '<id-field>' must be of data type int, ... or numeric with a scale of 0, and constrained to be nonnullable. |
De identity flag is dus kennelijk nog niet weggehaald.
Het nogmaals kopieeren van alle data uit alle tabellen naar weer een nieuwe tabel kan natuurlijk ook... maar ik vind 1x alle data dupliceren al wel genoeg eigenlijk...
Kortom; hoe krijg ik het toevoegen van een id-kolom voor een primary key voor elkaar volgens (een van) bovenstaand (of andere) methode?