Avatar billede frostedflake Nybegynder
07. september 2005 - 14:33 Der er 9 kommentarer

Import og updatering

Jeg har et problem.

Jeg skal have opdateret en tabel1 MSSQL-Server med en tabel2 jeg importerer fra Filemaker.
og jeg vil gerne have at den bare overskriver tabel1 med tabel2, og ikke bare ligger de nye data ind i "forlængelse" af de gamle i tabel1.

Lige nu er det eneste jeg kan finde ud af, nemlig at ligge dataene ind i tabel1 i folængelse af de gamle data, som allerede lå der. Dette giver en helvedes masse redundans, og det kan jeg ikke bruge til noget.

Hvordan får jeg tabel1 overskrevet med dataene fra tabel2?
Avatar billede frostedflake Nybegynder
08. september 2005 - 07:15 #1
Er der slet ikke nogen der kan hjælpe??
Avatar billede frostedflake Nybegynder
08. september 2005 - 11:22 #2
Hallo??
Avatar billede ldanielsen Nybegynder
08. september 2005 - 12:23 #3
Jeg kender ikke så meget til Filemaker, men anyhow ...

Importer de nye data til en tabel Tabel2 (som du senere sletter igen).

Jeg går udfra at du har en Primær nøgle i Tabel1 og i Tabel2, som stemmer overens. Jeg kalder den her for ID, dette og de andre kolonnenavne skal du naturligvis erstatte med de rigtige.

Så kører du denne:

UPDATE Tabel1 SET
Tabel1.Col1 = Tabel2.Col1,
Tabel1.Col2 = Tabel2.Col2,
Tabel1.Col3 = Tabel2.Col3,
Tabel1.Col4 = Tabel2.Col4,
Tabel1.Col5 = Tabel2.Col5
FROM Tabel2 WHERE Tabel1.ID = Tabel2.ID

Denne SQL overskriver posterne i Tabel1 med værdier fra Tabel2. Poster i Tabel1 som ikke findes i Tabel2 bliver ikke berørt.

Hvis der findes Poster i Tabel2 som ikke findes i Tabel1, og du vil have dem ind i Tabel1 skal du køre denne:

SET IDENTITY_INSERT Tabel1 ON
INSERT INTO Tabel1 (ID, Col1, Col2, Col3, Col4, Col5)
SELECT Tabel2.Col1, Tabel2.Col2, Tabel2.Col3, Tabel2.Col4, Tabel2.Col5
FROM Tabel2 WHERE Tabel2.ID NOT IN (SELECT TAbel1.ID FROM Tabel1)
SET IDENTITY_INSERT Tabel1 OFF

De to IDENTITY_INSERT-linier skal du kun bruge hvis ID er identity.

Og pas nu på, test test test, for der findes ikke "Fortryd" i MSSQL. Kun Backups

Og sig hvis du får fejlmeldinger, for jeg har ikke prøvekørt koden, der kan være typos
Avatar billede ldanielsen Nybegynder
08. september 2005 - 12:25 #4
SET IDENTITY_INSERT Tabel1 ON
GO

INSERT INTO Tabel1 (ID, Col1, Col2, Col3, Col4, Col5)
SELECT Tabel2.Col1, Tabel2.Col2, Tabel2.Col3, Tabel2.Col4, Tabel2.Col5
FROM Tabel2 WHERE Tabel2.ID NOT IN (SELECT TAbel1.ID FROM Tabel1)

SET IDENTITY_INSERT Tabel1 OFF
GO

- der manglede lige GO
Avatar billede frostedflake Nybegynder
08. september 2005 - 13:31 #5
Tak det vil jeg prøve. Vender tilbage med svar om det virker.
Avatar billede borrisholt Novice
08. september 2005 - 14:40 #6
Hvis Tabel1 og Tabe2 er ens så :

Drop Table1
Select * into Table1 from Table2

jens B
Avatar billede ldanielsen Nybegynder
09. september 2005 - 09:39 #7
Var det bare så let, så ...

Hvis man gør sådan vil der dannes en ny Tabel1, men den kommer til at mangle indexerne fra Tabel2. Der vil altså ikke være nogen Primary Key, Default values osv.

Hvis den "Gamle" Tabel1 refererer til andre tabeller via Foreign keys, vil det enten ikke være muligt at droppe den, eller det vil resultere i cascading deletes.

Min løsning tager højde for dette, blot frostedflake husker ikke at medtage kolonner der fungerer som foreign keys i UPDATE-sætningen uden at overvej det nøje. Disse felte vil jo oftest heller ikke kunne skifte værdi.
Avatar billede dr_chaos Nybegynder
15. september 2005 - 08:59 #8
frostedflake du har nogle spørgsmål du mangler at accepterer svar på.
Avatar billede dr_chaos Nybegynder
04. februar 2006 - 16:40 #9
Du mangler at lukke spørgsmålet.
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