Kopieren von (Hunderten von) Tabellen von einem Server auf einen anderen (mit SSMS)

27

Ich habe mehrere hundert (derzeit 466, aber ständig wachsende) Tabellen, die ich von einem Server auf einen anderen kopieren muss.

Ich musste das noch nie machen, daher bin ich mir nicht sicher, wie ich es angehen soll. Alle Tabellen haben dasselbe Format:Cart<Eight character customer number>

Dies ist Teil eines größeren Projekts, bei dem ich all diese Cart<Number>Tabellen zu einer CartsTabelle zusammenführe, aber das ist eine ganz andere Frage.

Hat jemand eine Best-Practice-Methode, mit der ich alle diese Tabellen kopieren kann? Die Datenbanknamen auf beiden Servern sind gleich, wenn das hilft. Und wie ich bereits sagte, ich habe das saKonto, damit ich alles tun kann, um die Daten von A nach B zu bekommen. Beide Server befinden sich ebenfalls in derselben Serverfarm.

410_Vergangen
quelle
2
Möglicherweise von Interesse dba.stackexchange.com/questions/30473/…
billinkc

Antworten:

21

Sie können die Aufgabe "Daten exportieren" von SQL Server Management Studio verwenden. Klicken Sie mit der rechten Maustaste auf die Datenbank in SSMS, wählen Sie Aufgaben und dann "Daten exportieren". Es wird ein interaktiver Assistent gestartet, mit dem Sie Tabellen von einem Server auf einen anderen kopieren können, obwohl Sie die Indizes selbst neu erstellen müssen. Der Assistent erstellt ein temporäres SSIS-Paket (obwohl Sie es auch speichern können) und ist relativ schnell.

Alex
quelle
4
Kann bei Interesse auch die gleiche Exportaufgabe über PowerShell ausführen. Ein ähnliches Skript zum Ausführen dieser Aktion finden Sie in meiner Antwort hier: dba.stackexchange.com/a/122149/507
Shawn Melton
Warum kopiert der Import / Export die Indizes und Abhängigkeiten nicht? Wäre es nicht zu schwierig, die Indizes für 466 Tabellen neu zu erstellen?
Vini
@Vini Sie können auch den Assistenten zum Generieren von Skripten verwenden, mit dem Sie Indizes kopieren können (ich weiß jedoch nicht, ob er zuverlässig ein Skript in der richtigen Abhängigkeitsreihenfolge generiert - dafür habe ich immer RedGate SQL Compare verwendet).
Aaron Bertrand
@ AaronBertrand: OK. Ich hatte auch die gleiche Frage. Aber als ich datetime importierte, wurde es auch in smalldatetime konvertiert
Vini
23

Hier ist ein schneller und unsauberer Ansatz, der nur einen Verbindungsserver in jeder Richtung mit ausreichenden Berechtigungen, Sortierkompatibilität und aktiviertem Datenzugriff benötigt. Sie führen dies auf dem Quell-Verbindungsserver aus, um das dynamische SQL zu generieren, das auf dem Ziel-Verbindungsserver ausgeführt wird.

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'SELECT * INTO [database].dbo.' + QUOTENAME(name)
  + N' FROM [source_linked_server].[database].dbo.' + QUOTENAME(name) + N';'
FROM sys.tables
WHERE name LIKE N'Cart[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]';

PRINT @sql; -- this will only print 8K, enough to spot check
--EXEC [destination_linked_server].master.sys.sp_executesql @sql;
Aaron Bertrand
quelle
19

Wenn Sie möchten, dass etwas, das per Skript erstellt werden kann, beim Testen leicht wieder ausgeführt werden kann und geringfügige Änderungen vornimmt, lesen Sie meine Antwort hier:

Importieren Sie Daten aus einer Datenbank in ein anderes Skript

Diese Antwort beschreibt die Verwendung einer gespeicherten SQLCLR-Prozedur, die die SqlBulkCopyKlasse in .NET verwendet. Die Verwendung dieser gespeicherten Prozedur kann in einem Cursor erfolgen, der die Tabellen durchläuft. Dies ermöglicht eine einfache Bearbeitung des Prozesses sowie die Berücksichtigung neuer Tabellen oder das einfache Ausschließen einer oder mehrerer Tabellen über eine WHEREBedingung in der Cursorabfrage.

Solomon Rutzky
quelle