sovrascrivi la tabella con i dati di un'altra tabella - SQL


9

I nostri utenti vogliono aggiornare un database QA dalla produzione ma vogliono due tabelle (chiamiamoli T1 e T2) per conservare i dati QA originali. Quindi ho copiato due tabelle dal QA (DB1) a un database QA temporaneo (DB2). Quindi DB1 aggiornato dalla produzione. Dopo l'aggiornamento, desidero sovrascrivere i dati T1 e T2 da DB2 a DB1 in modo che possano contenere valori di QA pre-aggiornamento.

Ho fatto quanto segue:

  1. Uso

    select * 
    INTO D1.dbo.T1
    FROM D2.dbo.T1
    
  2. Quindi aggiornato D1 dal prod

  3. Quindi troncare T1 con il seguente passaggio:

    SELECT COUNT(*) AS BeforeTruncateCount
    FROM T1;
    GO
    TRUNCATE TABLE T1;
    GO
    SELECT COUNT(*) AS AfterTruncateCount
    FROM T1;
    GO
    
  4. Ora, quando torno indietro per copiare i dati da D2.T1 a D1.T1, ottengo l'errore che esiste già un oggetto chiamato T1 nel database.

Devo eliminare il tavolo e copiarlo?

O esiste un metodo migliore per l'intera procedura?

Risposte:


6

Per combinare le risposte di @Kin e @DavidSpillett.

Innanzitutto un presupposto. DB1 e DB2 si trovano sulla stessa istanza. Sembra certamente che lo siano, ma non fa mai male affermare l'ovvio (soprattutto perché ho sbagliato con quello che pensavo fosse ovvio prima.)

Dato che, se i dati sono di grandi dimensioni, dire più milioni di righe quindi utilizzare un pacchetto SSIS. Questa ha una caratteristica specifica che vorrai usare. È possibile specificare una dimensione batch. In questo modo le dimensioni della transazione saranno inferiori. L'aspetto negativo del pacchetto SSIS è che aggiunge un livello di complessità al processo. Non è grande, ma se lavori con un tavolo più piccolo non ne hai bisogno.

Il che ci porta all'altra opzione. Se tuttavia i dati sono compresi nell'intervallo di alcune centinaia di migliaia o più, utilizzare il codice in questo modo.

USE D1;
GO
TRUNCATE TABLE dbo.T1;
GO
INSERT INTO D1.dbo.T1
SELECT * 
FROM D2.dbo.T1;
GO

E, ultimo ma non meno importante, se è da qualche parte sul boarder, proverei entrambi e vedrei cosa funziona meglio per te.

NOTA: si potrebbe anche considerare di non utilizzare a SELECT *su INSERT INTOe specificare invece un elenco di campi.

Quella struttura sarebbe simile a questa

INSERT INTO D1.dbo.T1 (Field1, Field2)
SELECT Field1, Field2
FROM D2.dbo.T1;

Grazie per le informazioni. Sì, la tabella ha solo 7800 righe, quindi è abbastanza piccola e nella stessa istanza. Ho provato a utilizzare INSERT INTO (senza selezionare) e ha funzionato perfettamente. Grazie condividere questo Inoltre ho testato con Import Data con SSMS. Anche quello ha funzionato alla grande.
Rizwan,

1
Tieni presente che dovrai specificare un elenco di campi (e non utilizzarlo *) se nella tabella è presente un campo di identità: tali valori non possono essere semplicemente "copiati".
Conrad,

6

IIRC con la SELECT <stuff> INTO <target> FROM ...sintassi SQL Server presume sempre che si desideri creare la tabella di destinazione da zero. Quando la tabella esiste già, prova INSERT <target> SELECT <stuff> FROM ...invece.


5
Inoltre, la risposta di David è anche un percorso migliore rispetto a DROP e SELECT INTO quando si spostano i dati su D1, poiché se si eliminano le tabelle D1, si perderebbero tutti gli oggetti figlio (ad esempio chiavi esterne, chiavi primarie, trigger, ecc. )
Delux,

2
Sono d'accordo con @Delux. Un'altra cosa importante che perderai sono le autorizzazioni esplicite. Se un utente dispone di autorizzazioni specifiche per quella tabella (anziché dirlo db_datareader), se si elimina la tabella, si perdono tali autorizzazioni.
Kenneth Fisher,

Questo è un ottimo consiglio. Finora non ho capito le conseguenze di DROP. Grazie!
Rizwan,

6

La cosa migliore è usare SSIS (Import / Export dei dati) per farlo. Ha la funzionalità di trasferire solo le tabelle selezionate dall'origine alla destinazione. Facoltativamente, è anche possibile salvare il pacchetto in modo che possa essere riutilizzato per trasferimenti futuri / ripetuti.

EDIT: aggiunta di più screenshot per maggiore chiarezza.

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine


wow .. grazie per gli screenshot fantastici .. sono di grande aiuto
Rizwan

Ottima soluzione, bei screenshot funzionano!
Mayer Spitzer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.