Avatar billede jbp Nybegynder
20. maj 2008 - 11:13 Der er 4 kommentarer

Insert into select from

Hej, mit problem er således:

Jeg har to databaser, strukturerne er helt ens.
Den ene indenholder en masse data som jeg gerne vil have over i den anden, ud fra nogen kriterier.
Det virker også fint når jeg siger

INSERT INTO [DB9].[dbo].[tabel1]
SELECT TOP 10 * FROM [DB10].[dbo].[tabel1]
WHERE KundeGruppe='gruppenavn'

Men jeg vil gerne have flere kriterier på således at, at når der indsættes en ny Kunde i DB10, og jeg kører sql'en så skal kun de nye kunder med over i DB9 (så jeg undgår dupletter).
Jeg overvejede noget i denne stil men det virker ikke:
INSERT INTO [DB9].[dbo].[tabel1]
SELECT * FROM [DB10].[dbo].[tabel1]
WHERE KundeGruppe='gruppenavn' 
AND [DB9].[dbo].[tabel1].Kunde_id <> DB10].[dbo].[tabel1].Kunde_id

Er der nogen der kan hjælpe mig et skridt videre?
Avatar billede jbp Nybegynder
20. maj 2008 - 11:34 #1
Jeg er kommet frem at bruge dette midlertidigt:

INSERT INTO [DB9].[dbo].[tabel1]
SELECT * FROM [DB10].[dbo].[tabel1]
WHERE KundeGruppe='gruppenavn' 
AND [DB9].[dbo].[tabel1].Kunde_id > (SELECT MAX(kunde_id) FROM [DB10].[dbo].[tabel1].Kunde_id)
Avatar billede janus_007 Nybegynder
20. maj 2008 - 12:27 #2
Det skal du bruge replikering til :)

Der kan jo også være updates ik? De skal også overføres/updates :)
Avatar billede jbp Nybegynder
20. maj 2008 - 12:54 #3
Ok, men der skal ikke være updates i denne..

Jeg prøver at kigge lidt på replikering så
Avatar billede janus_007 Nybegynder
20. maj 2008 - 17:58 #4
Hvis du ikke skal bruge updates eller deletes, og du samtidigt ikke har et særligt behov for netop at anvende replikering udover til do., så tror jeg måske, jeg ville vælge en normal insert som den du selv har lavet.

Den du har lavet her:
INSERT INTO [DB9].[dbo].[tabel1]
SELECT * FROM [DB10].[dbo].[tabel1]
WHERE KundeGruppe='gruppenavn' 
AND [DB9].[dbo].[tabel1].Kunde_id > (SELECT MAX(kunde_id) FROM [DB10].[dbo].[tabel1].Kunde_id)


Den overholder kravet og er samtidig simpel - ingen grund til at komplicerer det yderligere. K.I.S.S. :)

Du kan måske opnå en bedre performance og mulighed for logging vha.

declare @max_kundeID int
declare @rows int
declare @msg varchar(25)

SELECT @max_kundeID = MAX(kunde_id) FROM [DB10].[dbo].[tabel1].Kunde_id

INSERT INTO [DB9].[dbo].[tabel1]
SELECT * FROM [DB10].[dbo].[tabel1]
WHERE KundeGruppe='gruppenavn' 
AND [DB9].[dbo].[tabel1].Kunde_id > @max_kundeID
set @rows = @@rowcount

Herefter kan du så logge @max_kundeID evt. i din egen tabel, en eller anden logtabel med datetime, så har man styr på hvornår det kører.
Ellers kan du jo smide en logwrite ud til SQL's egen

RAISERROR('Hurra.. I transferred : %d rows', 16, 1, @rows) WITH LOG
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