Kopieren Sie Tabellen in SQL Server von einer Datenbank in eine andere

324

Ich habe eine Datenbank namens foo und eine Datenbank namens bar. Ich habe eine Tabelle in foo mit dem Namen tblFoobar, die ich (Daten und alle) aus der Datenbank foo in die Datenbankleiste verschieben möchte. Was ist die SQL-Anweisung, um dies zu tun?

RyanKeeter
quelle

Antworten:

208

Auf SQL Server? und auf dem gleichen Datenbankserver? Verwenden Sie eine dreiteilige Benennung.

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

Dadurch werden nur die Daten verschoben. Wenn Sie die Tabellendefinition (und andere Attribute wie Berechtigungen und Indizes) verschieben möchten, müssen Sie etwas anderes tun.

Amy B.
quelle
Ich glaube, Sie müssen Tabellenberechtigungen auch separat festlegen.
Ken Ray
1
Wenn Sie auch Identitätseinfügungen vornehmen müssen, hat der Datenimport-Assistent eine Option dafür ^^ - unter Bezugnahme auf die andere Antwort
Clarence Liu
13
@TahaRehmanSiddiqui: Weil es die Frage beantwortet;) Er hat nicht gefragt, wie man es zwischen Datenbankservern kopiert. Aber die meisten Leute, die nach dieser Antwort suchen, landen hier, weil Google sie als erstes Ergebnis liefert :)
Maarten Kieft
1
@ RyanB ja, das ist erlaubt.
Amy B
1
@ Tom OP und viele Leute, die zu dieser Frage kommen, suchen nach einer "SQL-Anweisung", nicht nach einem Tool.
Amy B
535

Die Aufgabe "Daten importieren" von SQL Server Management Studio (Rechtsklick auf den DB-Namen, dann Aufgaben) erledigt das meiste für Sie. Führen Sie es aus der Datenbank aus, in die Sie die Daten kopieren möchten.

Wenn die Tabellen nicht vorhanden sind, werden sie für Sie erstellt, aber Sie müssen wahrscheinlich alle Indizes und dergleichen neu erstellen. Wenn die Tabellen vorhanden sind, werden die neuen Daten standardmäßig angehängt. Sie können dies jedoch anpassen (Zuordnungen bearbeiten), sodass alle vorhandenen Daten gelöscht werden.

Ich benutze das die ganze Zeit und es funktioniert ziemlich gut.

David
quelle
1
Ich kann diese Option nicht finden. Gibt es hier etwas Versionsspezifisches?
Nerrve
35
Man kann nicht wirklich sagen, dass es im Allgemeinen eine bessere Antwort ist. Es ist unbrauchbar, wenn die Automatisierung beispielsweise aus einem Skript heraus aufgerufen wird. Übrigens bat der Autor speziell um eine "..SQL-Anweisung ..". Aber natürlich ist es eine gute Antwort, aber keine bessere;).
Grizzly
3
Der Autor bat darum, "(Daten und alle)" zu verschieben; Also hoffte ich, dass diese Antwort das tat. Es erstellt die Tabelle, erstellt jedoch keine Schlüssel oder Indizes. also keine große Verbesserung gegenüber der SQL-Antwort.
Unubar
Ist es möglich, eine WHEREBedingung mithilfe der Aufgabe Daten importieren anzugeben ? Ich konnte keinen Weg finden, dies zu tun.
Crush
1
Ja, dies ist der richtige Weg, wie auch hier erwähnt , aber identityund foreign keyVerweise werden in der Zieldatenbank entfernt. Gibt es eine Lösung?
Shaijut
106

Das sollte funktionieren:

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

Es werden keine Konstanten, Standardeinstellungen oder Indizes kopiert. Die erstellte Tabelle hat keinen Clustered-Index.

Alternativ können Sie:

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

Wenn Ihre Zieltabelle existiert und leer ist.

Leoinfo
quelle
Gibt es ein Problem, wenn Sie zuerst die Basistabellenstruktur (Felder und Daten) kopieren und dann ein Patch- Skript anwenden , um Berechtigungen, Indizes, Einschränkungen und erweiterte Eigenschaften zu erstellen?
Leoinfo
4
Dadurch werden in SQL Server 2008 keine Werte für Identitätsspalten eingefügt. Dies ist nur zulässig, wenn Sie eine Spaltenliste verwenden und IDENTITY_INSERT für die Zieltabelle aktiviert ist.
Lucas Wilson-Richter
@ Lucas - Du hast "halb" recht :). Die erste SQL-Anweisung kopiert jedoch ALLE Daten, einschließlich der Werte in den Identitätsspalten. Wie gesagt, die Einschränkungen werden nicht erstellt. Sie können jedoch einfach in der Quell-DB skriptiert und auf die Ziel-DB angewendet werden, sobald alle Daten verschoben wurden.
Leoinfo
Die zweite Version ( INSERT INTO...) hat bei mir in Oracle funktioniert.
Vapcguy
Funktioniert dies, wenn sich die beiden Datenbanken auf völlig unterschiedlichen Servern mit unterschiedlichen Verbindungszeichenfolgen befinden? Wenn nicht, wie gehen Sie damit um?
Alexander Ryan Baggett
46

Wenn es sich nur um einen Tisch handelt, müssen Sie nur noch etwas tun

  • Skripttabellendefinition
  • Erstellen Sie eine neue Tabelle in einer anderen Datenbank
  • Aktualisieren Sie Regeln, Indizes, Berechtigungen und dergleichen
  • Daten importieren (einige Einfügungen in Beispiele sind bereits oben gezeigt)

Eine Sache, die Sie berücksichtigen müssen, sind andere Updates, z. B. die Migration anderer Objekte in der Zukunft. Beachten Sie, dass Ihre Quell- und Zieltabellen nicht denselben Namen haben. Dies bedeutet, dass Sie auch Änderungen vornehmen müssen, wenn Sie abhängige Objekte wie Ansichten, gespeicherte Prozeduren und andere verwenden.

Mit einem oder mehreren Objekten können Sie ohne Probleme manuell wechseln. Wenn es jedoch mehr als nur ein paar Updates gibt, sind Vergleichstools von Drittanbietern sehr praktisch. Im Moment verwende ich ApexSQL Diff für Schemamigrationen, aber Sie können mit keinem anderen Tool etwas falsch machen.

Igor Voplov
quelle
23
  1. Skript das create tablein Management Studio, führen Sie dieses Skript in der Leiste aus, um die Tabelle zu erstellen. (Klicken Sie mit der rechten Maustaste auf die Tabelle im Objekt-Explorer, schreiben Sie die Tabelle als, erstellen Sie, um ...)

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

ScottStonehouse
quelle
1
Ich mag diesen Ansatz. Wählen Sie * funktioniert nicht, wenn eine Identitätsspalte vorhanden ist. Sie müssen die Spaltennamen explizit auflisten. SET IDENTITY_INSERT TblName ONIn diesem Fall müssen Sie dies auch tun .
JeremyWeir
16

Sie können auch den Assistenten zum Generieren von SQL Server-Skripten verwenden , um die Erstellung von SQL-Skripten zu unterstützen, die Folgendes tun können:

  • Kopieren Sie das Tabellenschema
  • Einschränkungen (Identität, Standardwerte usw.)
  • Daten innerhalb der Tabelle
  • und viele andere Optionen bei Bedarf

Gutes Beispiel für einen Workflow für SQL Server 2008 mit den hier gezeigten Screenshots .

Ryan
quelle
Siehe meine Kommentare oben: "Wie kam es zu 508/171 Stimmen und Ryans" 11. Oktober 11 um 23:41 "Antwort bekommen nur 13 bis heute?!? Ryans ist die einzige Antwort , die die Antwort ist q. Vollständig . Weil es behandelt diese Szenarien (die das OP übrigens NICHT von seinem q ausgeschlossen hat): a) Identität ( sehr häufig), b) Einschränkungen, c) Trigger, d) Indizes, e) Berechtigungen, d) Kopieren von Schema UND Daten ( Hinweis: Der "und alle" Teil von op's "(data and all)" impliziert auch Schema.) Und e) generiert "SQL-Anweisungen", die der op angegeben hat, auch wenn er nicht wörtlich gemeint hat, dass es besser ist, sie zu haben als nicht.".
Tom
1
Hinweis: Diese Antwort ist nur dann sinnvoll, wenn die Anzahl der Zeilen nicht "übermäßig" (dh Nachschlagetabellen / kleine Transaktionstabellen) und keine "großen" Spaltenwerte sind. Für diese würde ich Ryans Antwort verwenden, um nur das Skript für die Tabellenerstellung (einschließlich Spaltenattribute und Unterobjekte) zu erstellen, und dann David Bs Antwort "In Auswahl einfügen" verwenden. Für einzelne Tabellen (anstelle von Ryans A) können Sie auch SSMS, Objekt-Explorer, Rechtsklick-Tabelle, Skript-Tabelle als, ERSTELLEN auf verwenden. Sie müssen jedoch zunächst sicherstellen, dass Extras, Optionen, SQL Server-Objekt-Explorer und Skriptoptionen verfügbar sind wie gewünscht einstellen.
Tom
9

Sie können diesen Weg gehen: (ein allgemeines Beispiel)

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

Wenn Sie auch die Spaltennamen generieren müssen, um die Einfügungsklausel einzufügen, verwenden Sie:

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

Kopieren Sie das Ergebnis und fügen Sie es in das Abfragefenster ein, um die Namen Ihrer Tabellenspalten darzustellen. Dadurch wird auch die Identitätsspalte ausgeschlossen:

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

Denken Sie daran, dass das Skript zum Kopieren von Zeilen funktioniert, wenn die Datenbanken zum selben Speicherort gehören.


Sie können dies versuchen.

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

Der Servername ist optional, wenn sich beide DBs auf demselben Server befinden.

NeverHopeless
quelle
1

Wenn eine Tabelle vorhanden ist und wir nur Daten kopieren möchten, können wir diese Abfrage versuchen.

in Destination_Existing_Tbl einfügen wählen Sie col1, col2 FROM Source_Tbl

Mohan
quelle
0

Daten kopieren

INSERT INTO Alfestonline..url_details(url,[status],recycle) 
SELECT url,status,recycle FROM AlfestonlineOld..url_details
Arun Prasad ES
quelle