Avatar billede benneharli Juniormester
12. november 2008 - 10:21 Der 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?

/Benji
Avatar billede aaberg Nybegynder
12. november 2008 - 10:55 #1
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.
Avatar billede benneharli Juniormester
12. november 2008 - 11:12 #2
Øhh... SQL Server Integration Services? Der er ikke andre tabeller der refererer til PK. Kan du uddybe lidt?

/Benji
Avatar billede aaberg Nybegynder
12. november 2008 - 11:23 #3
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.
Avatar billede benneharli Juniormester
12. november 2008 - 11:26 #4
Tænker at det må være rimeligt nemt at lave et script der hedder:

MERGE (column1,column2,column3,column4) FROM DB1 TO DB2 AUTOINCREMENT

Ved godt at det ikke skal stå sådan - det er det der er mit problem...

/Benji
Avatar billede benneharli Juniormester
12. november 2008 - 11:26 #5
Hov, så ikke lige dit svar. :-(

Hvor i dit script bliver den nye PK sat?

/Benji
Avatar billede aaberg Nybegynder
12. november 2008 - 12:04 #6
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.
Avatar billede benneharli Juniormester
12. november 2008 - 12:05 #7
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
Avatar billede benneharli Juniormester
12. november 2008 - 12:11 #8
Ser ud til at man skulle kunne gøre det noget mere barberet:

SELECT TrendLogId,ValueType,LogTime,LogValue
INTO AlbVarm2000\TrenLogValue
FROM AlbVarm2005\TrenLogValue

Ved bare stadig ikke hvordan jeg skal angive at det er to forskellige databaser.

/Benji
Avatar billede benneharli Juniormester
12. november 2008 - 12:13 #9
Er det sådan her?

SELECT TrendLogId,ValueType,LogTime,LogValue
INTO AlbVarm2000.TrenLogValue
FROM AlbVarm2005.TrenLogValue
Avatar billede aaberg Nybegynder
12. november 2008 - 12:59 #10
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.
Avatar billede benneharli Juniormester
12. november 2008 - 13:20 #11
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.
Avatar billede benneharli Juniormester
12. november 2008 - 14:55 #12
Nå, jeg tror jeg har nok... Har lige fundet ud af at der er lidt mere der skal med.

Smid et svar.

/Benji
Avatar billede aaberg Nybegynder
12. november 2008 - 15:31 #13
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 :-)
Avatar billede koontz2 Nybegynder
14. november 2008 - 00:02 #14
autoincrement kan faktisk slås fra

set identity_insert TrendLogValue on
insert into .....

set identity_insert TrendLogValue off
starter herefter igen
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