Copia le tabelle da un database a un altro in SQL Server


325

Ho un database chiamato foo e un database chiamato bar. Ho una tabella in foo chiamata tblFoobar che voglio spostare (dati e tutto) nella barra del database dal database foo. Qual è l'istruzione SQL per fare questo?

Risposte:


208

Su SQL Server? e sullo stesso server di database? Usa la denominazione in tre parti.

INSERT INTO bar..tblFoobar( *fieldlist* )
SELECT *fieldlist* FROM foo..tblFoobar

Questo sposta solo i dati. Se vuoi spostare la definizione della tabella (e altri attributi come permessi e indici), dovrai fare qualcos'altro.


Dovrai anche impostare separatamente le autorizzazioni per la tabella, credo.
Ken Ray,

1
Se è necessario eseguire anche inserimenti di identità, l'importazione guidata dati ha un'opzione per questo ^^ - riferendosi all'altra risposta
Clarence Liu

13
@TahaRehmanSiddiqui: Perché risponde alla domanda;) Non ha chiesto come copiarlo tra i server di database. Ma la maggior parte delle persone che cercano questa risposta finiscono qui, perché Google lo dà come primo risultato :)
Maarten Kieft

1
@RyanB sì, è permesso.
Amy B,

1
@Tom OP e molte persone che arrivano a questa domanda cercano una "istruzione SQL", non uno strumento.
Amy B,

535

L'attività "Importa dati" di SQL Server Management Studio (fare clic con il pulsante destro del mouse sul nome del database, quindi sulle attività) farà la maggior parte delle operazioni. Eseguirlo dal database in cui si desidera copiare i dati.

Se le tabelle non esistono, le creerà per te, ma probabilmente dovrai ricreare qualsiasi indice e simili. Se le tabelle esistono, aggiungerà i nuovi dati per impostazione predefinita ma è possibile modificarli (modificare i mapping) in modo da eliminare tutti i dati esistenti.

Lo uso sempre e funziona abbastanza bene.


1
non riesco a trovare questa opzione. c'è qualcosa di specifico versione qui?
Nerrve,

35
Non puoi davvero dire che è una risposta migliore in generale. È inutile che l'automazione venga chiamata, ad esempio, da uno script. A proposito l'autore ha chiesto espressamente una "dichiarazione SQL ...". Ma ovviamente è un'ottima risposta, ma non migliore;).
grizzly

3
L'autore ha chiesto di spostare "(dati e tutti)"; quindi speravo che questa risposta lo facesse. Crea la tabella ma non crea chiavi o indici; quindi non c'è molto di un miglioramento rispetto alla risposta SQL.
unubar,

È possibile specificare una WHEREcondizione utilizzando l'attività Importa dati? Non sono riuscito a trovare un modo per farlo.
schiaccia il

1
sì, questo è il modo corretto come indicato anche qui , ma identitye i foreign keyriferimenti vengono rimossi nel database di destinazione, qualche soluzione?
Shaijut,

106

Questo dovrebbe funzionare:

SELECT * 
INTO DestinationDB..MyDestinationTable 
FROM SourceDB..MySourceTable 

Sarà Non copiare constaints, inadempienze o indici. La tabella creata non avrà un indice cluster.

In alternativa puoi:

INSERT INTO DestinationDB..MyDestinationTable 
SELECT * FROM SourceDB..MySourceTable

Se la tabella di destinazione esiste ed è vuota.


C'è qualche problema se prima copi la struttura della tabella di base (campi e dati) e poi applichi uno script di patch per creare autorizzazioni, indici, vincoli e proprietà estese?
leoinfo,

4
Ciò non inserirà valori per le colonne di identità in SQL Server 2008. È consentito solo quando si utilizza un elenco di colonne e IDENTITY_INSERT è ON per la tabella di destinazione.
Lucas Wilson-Richter,

@Lucas - Hai ragione "metà" :). Tuttavia, la prima istruzione SQL copia TUTTI i dati, inclusi i valori all'interno delle colonne identità. Come ho detto, i vincoli non vengono creati. Ma possono essere facilmente copiati sul DB di origine e applicati al DB di destinazione una volta spostati tutti i dati.
leoinfo,

La seconda versione ( INSERT INTO...) ha funzionato per me in Oracle.
vapcguy,

Funziona se i 2 database si trovano su server totalmente diversi con stringhe di connessione diverse? In caso contrario, come lo gestisci?
Alexander Ryan Baggett,

46

Se è solo una tabella, tutto ciò che devi fare è

  • Definizione della tabella di script
  • Crea una nuova tabella in un altro database
  • Aggiorna regole, indici, autorizzazioni e simili
  • Importa dati (diversi inserti negli esempi sono già mostrati sopra)

Una cosa che dovrai considerare è altri aggiornamenti come la migrazione di altri oggetti in futuro. Si noti che le tabelle di origine e destinazione non hanno lo stesso nome. Ciò significa che dovrai anche apportare modifiche se dipendi da oggetti come viste, stored procedure e altro.

Con uno o più oggetti puoi andare manualmente senza problemi. Tuttavia, quando ci sono molti altri aggiornamenti, gli strumenti di confronto di terze parti sono molto utili. In questo momento sto usando ApexSQL Diff per le migrazioni di schemi ma non puoi sbagliare con nessun altro strumento.


23
  1. Script in create tablein management studio, esegui quello script nella barra per creare la tabella. (Fare clic con il pulsante destro del mouse in Esplora oggetti, tabella script come, creare in ...)

  2. INSERT bar.[schema].table SELECT * FROM foo.[schema].table


1
Mi piace questo approccio. Selezionare * non funzionerà se esiste una colonna identità, tuttavia è necessario elencare esplicitamente i nomi delle colonne. Dovrai anche fare SET IDENTITY_INSERT TblName ONin quel caso.
JeremyWeir,

16

È inoltre possibile utilizzare la procedura guidata Genera script di SQL Server per guidare la creazione di script SQL in grado di effettuare le seguenti operazioni:

  • copia lo schema della tabella
  • eventuali vincoli (identità, valori predefiniti, ecc.)
  • dati all'interno della tabella
  • e molte altre opzioni se necessario

Buon esempio di flusso di lavoro per SQL Server 2008 con schermate mostrate qui .


Vedere i miei commenti sopra:?!? "Come è potuto ottenere 508/171 voti e Ryan '11 ottobre '11 a 23:41' risposta ottiene solo 13 ad oggi Ryan è l' unica risposta che la risposta di q del op. Completamente . Perché esso gestisce questi scenari (che, tra l'altro, l'OP NON ha escluso dalla sua q.): a) Identità ( molto comune), b) Vincoli, c) Trigger, d) Indici, e) Autorizzazioni, d) copia Schema AND Dati ( Suggerimento: la "e tutte le" parti di "operazioni (dati e tutte)" implicano anche Schema.) Ed e) genera "istruzioni SQL" che le operazioni hanno specificato che, anche se non intendeva letteralmente, è meglio avere che no ".
Tom,

1
Nota: questa risposta è pratica solo quando il numero di righe non è "eccessivo" (ovvero tabelle di ricerca / piccole transazioni) e nessun valore di colonna "grande". Per quelli, userei la risposta di Ryan solo per generare lo script per la creazione della tabella (incl. Attributi di colonna e oggetti secondari), e quindi utilizzare la risposta "Inserisci in selezione" di David B. Per le singole tabelle (anziché A di Ryan), puoi anche utilizzare SSMS, Esplora oggetti, Tabella clic con il tasto destro, Tabella script come, CREA A, ma devi prima assicurarti che Strumenti, Opzioni, Esplora oggetti di SQL Server, Le opzioni di scripting siano impostare come desiderato.
Tom,

9

Puoi procedere in questo modo: (un esempio generale)

insert into QualityAssuranceDB.dbo.Customers (columnA, ColumnB)
Select columnA, columnB from DeveloperDB.dbo.Customers

Inoltre, se è necessario generare anche i nomi delle colonne per inserire la clausola insert, utilizzare:

    select (name + ',') as TableColumns from sys.columns 
where object_id = object_id('YourTableName')

Copia il risultato e incollalo nella finestra della query per rappresentare i nomi delle colonne della tabella e anche questo escluderà anche la colonna identità:

    select (name + ',') as TableColumns from sys.columns 
where object_id = object_id('YourTableName') and is_identity = 0

Ricorda che lo script per copiare le righe funzionerà se i database appartengono alla stessa posizione.


Puoi provare questo.

select * into <Destination_table> from <Servername>.<DatabaseName>.dbo.<sourceTable>

Il nome del server è facoltativo se entrambi i DB si trovano nello stesso server.


1

Se esiste una tabella esistente e vogliamo copiare solo i dati, possiamo provare questa query.

inserire in Destination_Existing_Tbl selezionare col1, col2 FROM Source_Tbl


0

Copia dati

INSERT INTO Alfestonline..url_details(url,[status],recycle) 
SELECT url,status,recycle FROM AlfestonlineOld..url_details
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.