12. november 2008 - 10:21Der er
13 kommentarer og 1 løsning
SQL 2005 - Merge med fortløbende PK
Hejsa
Er lige rendt ind i en mur :-(
Jeg skal lægge to tabeller fra to databaser sammen i den ene database.
Problemet er at begge har en fortløbende PK, så det får jeg ikke lov til. Hvad skal der lige til for at merge værdierne fra 4 af de 5 kolonner i tabellen, og så automatisk fortsætte den fortløbende PK?
Du bliver nok nød til at inserte alle rader fra de 2 tabeller, og lade den nye tabel generere nye fortløbende PK værdier. Kompleksiteten øger en del, hvis du har andre tabeller der refererer til denne fortløbende PK, da bliver du nød til at lave en algoritme der opdaterer alle de refererende foreign keys undervejs. Hvis dette er noget du skal fuldautomatisere og gøre ofte, skal du måske overveje at bruge SQL Server Integration Services.
Hvis du ikke ved hvad Integration Services er, så bare glem det igen. Integration Services er en SQL Server komponent som blandt andet kan bruges til problemstillinger som denne.
Jeg går ud fra at tabellerne er ens. I så fald, kan du gøre noget lignende:
insert into nyTabel(col2,col3,col4) select col2, col3, col4 from tabel1 union all select col2, col3, col4 from tabel2
Hvis du ikke får det til at virke, så vil jeg gerne vide lidt mere om de forskellige tabeller, så kan jeg sikkert give et mere præcist eksempel.
Hvis PK kolonnen i den nye tabel er sat til at være en identity (autoincrement) kolonne, vil der automatisk blive genereret en ny PK værdi når du inserter i de andre kolonner.
Det er to identiske tabeller i to forskellige databaser. Er det så sådan her, eller hvad? Der skal eksporteres fra AlbVarm2000 til AlbVarm2005
insert into TrenLogValue(TrendLogId,ValueType,LogTime,LogValue) select TrendLogId, ValueType, LogTime, LogValue from AlbVarm2000/TrendLogValue union all select TrendLogId, ValueType, LogTime, LogValue from AlbVarm2005/TrendLogValue
Nej. Hvis du skal hente fra AlbVarm2005 databasen og inserte ind i AlbVarm2000 databasen, bliver syntaksen noget lignende:
INSERT INTO AlbVarm2000.TrenLogValue(TrendLogId, ValueType, LogTime, LogValue) SELECT TrendLogId, ValueType, LogTime, LogValue FROM AlbVarm2005.TrenLogValue
hvis det ikke virker, så prøv: INSERT INTO AlbVarm2000.dbo.TrenLogValue(TrendLogId, ValueType, LogTime, LogValue) SELECT TrendLogId, ValueType, LogTime, LogValue FROM AlbVarm2005.dbo.TrenLogValue
Jeg går ud fra at AlbVarm2000 og AlbVarm2005 er databaserne, og TrenLogValue er tabellerne. Hvis dette er forkert forstået, så virker mit eksempel ikke. Hvis TrendLogId kolonnen er autoincrement-kolonnen, skal denne fjernes fra querien, da den bliver generet automatisk af SQL Serveren.
Det er omvendt. Der skal indsættes fra 2000 til 2005, men ok ;-)
Den her virker... næsten...
INSERT INTO AlbVarm2005.dbo.TrendLogValue(TrendLogId, ValueType, LogTime, LogValue) SELECT TrendLogId, ValueType, LogTime, LogValue FROM AlbVarm2000.dbo.TrendLogValue
Den sidste kolonne (der ikke er med her og skal være unik) "Sequence" er ikke autoincrement. Kan man på en eller anden måde selv lave en fortløbende værdi (det er bare +1 hver gang) og indsætte den? Jeg kan jo selv finde sidste værdi i Sequence i AlbVarm2005. Den er 103584.
Hvis du stadig har brug for at dynamisk oprette autoincrement, uden at bruge den indebyggede funktionalitet, kan jeg nok godt finde ud af en måde at gøre det på i morgen. Jeg har desværre ikke tid nu. Bare skriv, hvis du ikke finder ud af det :-)
set identity_insert TrendLogValue on insert into .....
set identity_insert TrendLogValue off starter herefter igen
Synes godt om
Ny brugerNybegynder
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.