Domanda

Ho una situazione in cui ho bisogno di copiare una parte dei dati da un server a un altro. Lo schema della tabella è esattamente stessa. Ho bisogno di spostare i dati parziali dalla sorgente, che possono o non possono essere disponibili nella tabella di destinazione. La soluzione che sto pensando è, uso bcp per esportare i dati in un testo (o .dat) di file e poi prendere il file nella destinazione come entrambi non sono accessibili allo stesso tempo (un'altra rete), quindi importare i dati al destinazione. Ci sono alcune condizioni che devono soddisfare:

  1. Ho bisogno di esportare solo un elenco di dati dalla tabella, non è tutto. Il mio cliente sta per darmi gli ID, che deve essere spostato dalla sorgente alla destinazione. Ho circa 3000 record nella tabella principale, e lo stesso nelle tabelle figlio troppo. Quello che mi aspetto è, a soli 300 record da spostare.
  2. Se il record esiste nella destinazione, il cliente sta per istruire come se ignorare o caso di sovrascrittura per caso. Il 90% del tempo, abbiamo bisogno di ignorare i record senza sovrascrivere, ma registrare i record in un file di log.

Si prega di aiutarmi con l'approccio migliore. Ho pensato di utilizzare l'opzione BCP query con per filtrare i dati, ma durante l'importazione, come faccio a bypass inserendo i record esistenti? Come faccio sovrascrittura, se ciò che è necessario?

È stato utile?

Soluzione

Purtroppo BCPing in una tabella è un tutto o niente affare, non è possibile selezionare righe da portare in.

Quello che mi piacerebbe fare è. . .

  1. Creare un tavolo sulla fonte database, questo memorizzerà i di identificazione delle righe è necessario spostare. voi possono ora BCP le righe che si necessità.
  2. Nella database di destinazione, creare un nuovo lavoro in tabella Progress, e BCP le righe in là.
  3. Una volta lì si può scrivere uno script che deciderà o meno di una WIP fila va nella destinazione tavolo, oppure no.

Spero che questo aiuti.

Aggiorna

Per lavori in corso (WIP) Tavoli faccio tabelle #temp non significa, non è possibile BCP in una tabella temporanea (almeno sarei molto sprprised se fosse possibile).
Voglio dire una tabella che ci si crea con la stessa struttura della tabella di destinazione, BCP in quella, lo script le righe WIP alla tabella di destinazione quindi eliminare la tabella WIP.

Non hai detto quello RDBMS che si sta utilizzando, assumendo SQL Server, qualcosa di simile alla seguente (codice non provato). . .

-- following creates new table with identical schema to destination table
select * into WIP_Destination from Destination
where 1 = 0

-- BCP in the rows
BULK INSERT WIP_Destination from 'BcpFileName.dat'

-- Insert new rows into Destination
insert into Destination
Select * from WIP_Destination 
where not id  in (select id from Destination)

-- Update existing rows in destination

Update Destination 
set field1 = w.field1, 
    field2 = w.field2, 
    field3 = w.field3, 
    . . . 
from Destination d inner join WIP_Destination w on d.id = w.id

Drop table WIP_Destination

Aggiorna 2
OK, in modo da poter inserire in tabelle temporanee, ho appena provato (non ho avuto il tempo, l'altro giorno, mi spiace).

Sul problema dei record principale / dettaglio (e stiamo ora spostando fuori tema della domanda iniziale, se fossi in te mi piacerebbe aprire una nuova domanda per questo argomento, si otterrà più risposte che solo il mio)

È possibile scrivere un SP che farà un passo attraverso le nuove righe da aggiungere.
Quindi, stai scorrendo le righe della tabella temporanea (queste righe hanno l'id originale su di loro dal database di origine), inserto che riga nella tabella di destinazione, utilizzare SCOPE_IDENTITY per ottenere l'id della riga appena inserita. Ora avete il vecchio Id e il nuovo ID, è possibile creare un'istruzione INSERT che inserirà dichiarazione per le righe di dettaglio come. . .

insert into Destination_Detail
select @newId, field1, field2 . . . from #temp_Destination_Detail
where Id = @oldId

Spero che questo aiuti [se ha aiutato si è permesso di upvote questa risposta, anche se non è la risposta che stai andando a selezionare:)]

Grazie
BW

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top