Avatar billede snowball Novice
08. december 2009 - 15:56 Der er 7 kommentarer og
1 løsning

Script til at tilføje Primary Key til alle tabeller

Hej.

Jeg har importeret nogle Access databaser ind i MS SQL Server 2005.

Access skal stadig benyttes from frontend, så derfor er der lavet nogle linkede tabeller via ODBC, men for at det virker ordentlig, så skal der jo være et primary key felt i hver tabel, og det er der ikke.

Jeg er kommet så langt så jeg får oprettet et nyt felt, men det kniber med at få sat den som primary key fordi jeg mangler at få givet den pågældende primary key et unikt navn.

Så hvordan får jeg lavet "PK_myTable" om så den indeholder navnet på den tabel som scriptet er ved at håndtere?

Det virker ikke at skrive "PK_?" da jo så bliver til "PK_dbo."

*****************************************

USE [myDB]
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
EXEC sp_MSforeachtable @command1='ALTER TABLE ? ADD MemId int NOT NULL IDENTITY (1, 1)'
GO
EXEC sp_MSforeachtable @command1='ALTER TABLE ? ADD CONSTRAINT
    PK_myTable PRIMARY KEY CLUSTERED
    (
    MemId
    ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]'
COMMIT
GO
*****************************************

På forhånd tak.
Avatar billede terry Ekspert
08. december 2009 - 16:28 #1
Hi Snowball
Did you use Access's upsizing Wizard? If you did, then I'm surprised that the primary key wasnt copied over automatically. Unless of course you didnt have one in the first place :o)
Avatar billede snowball Novice
08. december 2009 - 16:34 #2
Nej, jeg importerede data via SQL Server Management Studio, men der er heller ikke nogen primary key defineret i Access databasen i forvejen.
Avatar billede janus_007 Nybegynder
08. december 2009 - 21:26 #3
Hvor mange tabeller er der tale om?
Avatar billede terry Ekspert
08. december 2009 - 21:36 #4
If its possible to just throw in an extra field as the primary key, then it sounds as though there are no relationships between any of the tables???
Avatar billede snowball Novice
09. december 2009 - 09:15 #5
janus_007: Ca. 70, så umiddelbart flere end jeg lige har lyst til at rette manuelt.

terry: Korrekt - det er der sådan set heller ikke.

Det er nogle gamle databaser lavet af en person som ikke er programmør eller IT kyndig, så mange ting er ikke helt som de burde være ;)
Avatar billede HenrikSjang Nybegynder
09. december 2009 - 16:53 #6
Det er ikke specielt elegant, men jeg ville nok generere mine sql-statements i én query, og så manuelt eksekvere dem bagefter.

Noget i stil med:


SELECT 'ALTER TABLE ' + name + ' ADD CONSTRAINT PK_' + name + ' PRIMARY KEY CLUSTERED (MemId)'
FROM sys.objects
WHERE type = 'U'

Jeg kan ikke lige huske om sys.objects har en type-kolonne, men ellers hedder den noget i den stil. 'U' betyder "user table".

Ovenstående script burde returnere de ca. 70 rows med hver deres alter table statement. Og så er det bare at kopiere de 70 linjer op i query vinduet, og trykke på F5 mens man krydser fingre :)
Avatar billede snowball Novice
09. december 2009 - 23:19 #7
Det virker som det skal, så det er helt fint.

Query'en endte med at se sådan her ud:

SELECT 'ALTER TABLE [' + name + '] ADD CONSTRAINT [PK_' + name + '] PRIMARY KEY CLUSTERED (MemId) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]'
FROM sys.objects
WHERE type = 'U'

Laver du lige et svar så du kan få point?

Tak for hjælpen :)
Avatar billede HenrikSjang Nybegynder
10. december 2009 - 08:10 #8
Glad for det virkede :)

Svar.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester