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?
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
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)
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.
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.