Exportieren Sie Tabellendaten von einem SQL Server auf einen anderen

71

Ich habe zwei SQL Server (beide 2005 Version).

Ich möchte mehrere Tabellen von einer zur anderen migrieren.

Ich habe versucht:

  • Auf dem Quellserver habe ich mit der rechten Maustaste auf die ausgewählte Datenbank geklickt Tasks/Generate scripts. Das Problem ist, dass es unter Table/View optionskeine Script dataOption gibt.

  • Dann habe ich Script Table As/Create scriptSQL-Dateien generiert, um die Tabellen auf meinem Zielserver zu erstellen. Aber ich brauche immer noch alle Daten.

Dann habe ich versucht:

SELECT * 
INTO [destination server].[destination database].[dbo].[destination table] 
FROM [source server].[source database].[dbo].[source table]

Aber ich bekomme den Fehler:

Objekt enthält mehr als die maximale Anzahl von Präfixen. Maximum ist 2.

Kann mich bitte jemand auf die richtige Lösung für mein Problem hinweisen?

no9
quelle
1
Können Sie bitte einige Ihrer generierten Aussagen anzeigen? Haben Sie die anderen Server als Verbindungsserver hinzugefügt?
Preet Sangha
nicht als Verbindungsserver. Das ergab keinen Sinn, da beide mssql2005 sind. Ich habe gerade die Verbindung hergestellt. Es muss Server verbunden sein?
Nr. 9
Die Anweisung "Into" (die eine Tabelle erstellt und in diese einfügt) unterstützt nur lokale Tabellen. Sie müssen zuerst die Tabelle erstellen und dann "Einfügen in [Zielserver]. [Zieldatenbank]. [Dbo]. [Zieltabelle]" verwenden.
Jumxozizi
Der einfache Weg ist, ein Backup (mit Daten) zu erstellen und dann in der Zieldatenbank wiederherzustellen
Naga
Ich habe Fehler wie Server nicht verfügbar / nicht verbunden. Also habe ich die folgenden Befehle verwendet und dann hat es USE Master funktioniert. GO EXEC sp_addlinkedserver Ns Servername ', N'SQL Server'; GO
karthik G

Antworten:

73

Versuche dies:

  1. Erstellen Sie Ihre Tabelle auf dem Zielserver mit Ihren Skripten aus dem Script Table As / Create ScriptSchritt

  2. Auf dem Zielserver können Sie dann eine T-SQL-Anweisung ausgeben:

    INSERT INTO dbo.YourTableNameHere
       SELECT *
       FROM [SourceServer].[SourceDatabase].dbo.YourTableNameHere
    

Dies sollte gut funktionieren.

marc_s
quelle
2
Ich mag Ihren Vorschlag. Ich habe es versucht und ich bekomme. Server "" in sys.servers konnte nicht gefunden werden. Stellen Sie sicher, dass der richtige Servername angegeben ist ... Möglicherweise liegt ein Problem vor, wenn der Name des Quellservers im Format "NAME \ NAME2" vorliegt. Aber ich denke, [] sollte das beheben ... Idee?
Nr. 9
18
@ no9: Entschuldigung - damit dies funktioniert, müssen Sie natürlich einen "Verbindungsserver" zwischen Ihren beiden Servern hinzufügen .
marc_s
1
Ja. Aber stellen Sie sich vor, ich habe Probleme beim Erstellen eines Verbindungsservers. Der Produktionsserver ist so eingestellt, dass Remoteverbindungen zugelassen werden, aber ich erhalte immer noch eine Zeitüberschreitung, selbst wenn ich mich als Identitätswechsel oder direkt usr / pwd verwende. Da sich die Serververwaltung nicht in meiner Domain befindet, kann ich nicht viel tun. Aber ich habe es geschafft, mein Problem anders zu lösen. Werde eine Antwort nur zum Spaß posten und deine akzeptieren, da mir die Lösung gefällt.
Nr. 9
53

Nur um noch eine weitere Option anzuzeigen (für SQL Server 2008 und höher):

  1. Klicken Sie mit der rechten Maustaste auf Datenbank -> wählen Sie "Aufgaben" -> wählen Sie "Skripte generieren".
  2. Wählen Sie bestimmte Datenbankobjekte aus, die Sie kopieren möchten. Sagen wir eine oder mehrere Tabellen. Weiter klicken
  3. Klicken Sie auf Erweitert und scrollen Sie nach unten zu "Zu skriptende Datentypen" und wählen Sie "Schema und Daten". OK klicken
  4. Wählen Sie aus, wo das generierte Skript gespeichert werden soll, und klicken Sie auf Weiter
Konstantin
quelle
2
Diese Option ist in Microsoft SQL Management Studio Version 9 (zusammen mit SQL Server 2005) nicht verfügbar, auf das sich das OP höchstwahrscheinlich bezieht.
Marcel
2
Gute Lösung, aber bei großen Tischen wird es problematisch.
Duane
10

Es gibt eine Skripttabellenoption unter Aufgaben / Skripte generieren! Ich habe es auch am Anfang verpasst! Sie können dort jedoch Einfügeskripte erstellen (sehr nette Funktion, aber an einer sehr unintuitiven Stelle).

Wenn Sie zu Schritt "Skriptoptionen festlegen" gelangen, wechseln Sie zur Registerkarte "Erweitert".

Schritte beschrieben hier (Bilder können verstehen, aber ich schreibe in lettisch dort).

Jānis
quelle
8

Versuchen Sie es mit dem SQL Server- Import- und Export-Assistenten (unter Aufgaben -> Daten exportieren).

Es bietet an, die Tabellen in der Zieldatenbank zu erstellen. Wie Sie gesehen haben, kann der Skriptassistent nur die Tabellenstruktur erstellen.

Damien_The_Unbeliever
quelle
Es gibt keine Exportdatenoption in der Datenbank, aus der ich Tabellen exportieren möchte. Es ist nur: Trennen, Verkleinern, Sichern, Wiederherstellen, Generieren von Skripten ...
Nr. 9
Scripting Wizzard kann auch Daten exportieren
user763539
@ user763539 - wirklich? Als ich das letzte Mal nachgesehen habe, gab es keine Option zum Generieren eines Skripts, das z. B. INSERTAnweisungen enthält. scheint für sql-server-2005 sicherlich zuzutreffen . Haben Sie einen Link oder eine Referenz?
Damien_The_Unbeliever
Die bisher beste Lösung für mich!
Shai Alon
@Damien_The_Unbeliever, warum bestehen Sie darauf, Skripte zu generieren? Das war nicht die Frage ...
Shai Alon
8

Wenn Sie keine Berechtigung zum Verknüpfen von Servern haben, führen Sie die folgenden Schritte aus, um eine Tabelle mithilfe des SQL Server-Import- / Export-Assistenten von einem Server auf einen anderen zu importieren:

  • Klicken Sie mit der rechten Maustaste auf die Quellendatenbank, aus der Sie kopieren möchten.
  • Wählen Sie Aufgaben - Daten exportieren.
  • Wählen Sie in der Datenquelle SQL Server Native Client aus.
  • Wählen Sie Ihren Authentifizierungstyp (SQL Server- oder Windows-Authentifizierung).
  • Wählen Sie die Quellendatenbank aus.
  • Wählen Sie als Nächstes das Ziel: SQL Server Native Client
  • Geben Sie Ihren Servernamen ein (den Server, auf den Sie die Tabelle kopieren möchten).
  • Wählen Sie Ihren Authentifizierungstyp (SQL Server- oder Windows-Authentifizierung).
  • Wählen Sie die Zieldatenbank aus.
  • Wählen Sie Daten kopieren.
  • Wählen Sie Ihre Tabelle aus der Liste.
  • Klicken Sie auf Weiter, wählen Sie Sofort ausführen aus. Optional können Sie das Paket auch in einer Datei oder einem SQL Server speichern, wenn Sie es später ausführen möchten.
  • Fertig
Live-Liebe
quelle
1
Es stellte sich heraus, dass dies der einfachste Ansatz für mich war. Obwohl ssms sehr langsam arbeitet, um diesen Assistenten zu öffnen!
Shahryar Saljoughi
6

Wenn die Tabellen bereits mit den Skripten erstellt wurden, können Sie die Daten auch mithilfe des BCP-Befehls kopieren, um alle Daten von Ihrem Quellserver auf Ihren Zielserver zu kopieren

So exportieren Sie die Tabellendaten in eine Textdatei auf dem Quellserver:

bcp <database name>.<schema name>.<table name> OUT C:\FILE.TXT -c -t -T -S <server_name[ \instance_name]> -U <username> -P <Password> 

So importieren Sie die Tabellendaten aus einer Textdatei auf dem Zielserver:

bcp <database name>.<schema name>.<table name> IN C:\FILE.TXT -c -t -T -S <server_name[ \instance_name]> -U <username> -P <Password>
praveen
quelle
1
Ich habe das schon einmal gesehen, aber seit ich von einem Produktionsserver exportiere, war ich mir nicht sicher, ob es sicher ist :)
Nr. 9
1
Sie ändern Ihre Tabelle nicht so, dass sie absolut sicher ist, aber denken Sie daran, die IN- oder OUT-Anweisung ordnungsgemäß zu verwenden. In, um die Daten von der Textdatei in die Tabelle zu bekommen, und OUT, um die Daten aus der Tabelle in eine Textdatei (oder eine CSV-Datei) zu bekommen
praveen
Verwenden Sie "-T" für eine vertrauenswürdige Verbindung oder "-U <Benutzername> -P <Passwort>" für die SQL-Anmeldung.
Jumxozizi
3

Nur für die Tritte.

Da ich keinen Verbindungsserver erstellen konnte und es nicht ausreichte, nur eine Verbindung zum Produktionsserver herzustellen, habe INSERT INTOich Folgendes getan:

  • hat eine Sicherung der Produktionsserverdatenbank erstellt
  • stellte die Datenbank auf meinem Testserver wieder her
  • hat die Einfügung in Anweisungen ausgeführt

Es ist eine Backdoor-Lösung, aber da ich Probleme hatte, hat es für mich funktioniert.

Da ich leere Tabellen mit erstellt habe SCRIPT TABLE AS / CREATE, um alle Schlüssel und Indizes zu übertragen, konnte ich nicht verwenden SELECT INTO. SELECT INTOFunktioniert nur, wenn die Tabellen am Zielspeicherort nicht vorhanden sind, aber keine Schlüssel und Indizes kopiert werden. Sie müssen dies also manuell durchführen. Der Nachteil der using- INSERT INTOAnweisung besteht darin, dass Sie alle Spaltennamen manuell angeben müssen. Außerdem können Probleme auftreten, wenn einige Fremdschlüsseleinschränkungen fehlschlagen.

Vielen Dank an alle Antworten, es gibt einige großartige Lösungen, aber ich habe mich entschieden, marc_s Antwort zu akzeptieren.

no9
quelle
2

Sie können keinen Quell- / Zielserver auswählen.

Wenn sich die Datenbanken auf demselben Server befinden, können Sie Folgendes tun:

Wenn die Spalten der Tabelle gleich sind (einschließlich Reihenfolge!), Können Sie dies tun:

INSERT INTO [destination database].[dbo].[destination table]
SELECT *
FROM [source database].[dbo].[source table]

Wenn Sie dies einmal tun möchten, können Sie die Quellendatenbank sichern / wiederherstellen. Wenn Sie dies häufiger tun müssen, empfehlen wir Ihnen, ein SSIS-Projekt zu starten, in dem Sie die Quellendatenbank definieren (dort können Sie eine beliebige Verbindung auf einem beliebigen Server auswählen) und ein Projekt zu erstellen, in dem Sie Ihre Daten dorthin verschieben. Weitere Informationen finden Sie hier: http://msdn.microsoft.com/en-us/library/ms169917%28v=sql.105%29.aspx

YvesR
quelle
2
Ja, Sie können, wenn Sie sie als Verbindungsserver hinzugefügt haben msdn.microsoft.com/en-us/library/ms188279.aspx
Preet Sangha
Na ja, das wusste ich selbst nicht. Danke, dass du mich dazu aufgeklärt hast. Im obigen Fall empfehle ich weiterhin ein SSIS-Projekt für diese Aufgaben.
YvesR
SSIS ist ein bisschen überladen für eine einmalige Kopie - aber für reguläre und inkrementelle Ladevorgänge würde ich es auch empfehlen!
Preet Sangha
da sein SQL2005 Express SSIS nicht unterstützt wird.
Nr. 9
1
SQL 2005 Express? Standard und höher hat SSIS.
YvesR
2

So kopieren Sie Daten von der Quelle zum Ziel:

use <DestinationDatabase>
select * into <DestinationTable> from <SourceDataBase>.dbo.<SourceTable>
David Brabant
quelle
Ich habe zwei verschiedene Server. Wenn ich nur einen hätte, würde das funktionieren.
Nr. 9
1
Haben Sie einen Verbindungsserver erstellt? Nicht klar aus Ihrer Frage. Fügen Sie dann den Namen des <SourceServers> vor <SourceDatabase> in die obige Abfrage ein (ausgeführt auf dem <DestinationServer>).
David Brabant
Ich kann keinen Verbindungsserver erstellen. Siehe meine Antwort auf marc_s Antwort
Nr. 9
2

Dies kann über "Daten importieren / exportieren ..." in SQL Server Management Studio erfolgen

Vil
quelle
1

Dies ist eine Umgehungslösung, aber es hat bei mir funktioniert. Ich hoffe, es funktioniert bei diesem Problem auch bei anderen:

Sie können die ausgewählte SQL-Abfrage für die Tabelle ausführen, die Sie exportieren möchten, und das Ergebnis als XLS-Datei auf Ihrem Laufwerk speichern.

Erstellen Sie nun die Tabelle, zu der Sie Daten hinzufügen möchten, mit allen Spalten und Indizes. Dies ist einfach möglich, indem Sie mit der rechten Maustaste auf die aktuelle Tabelle klicken und die Option Skript erstellen erstellen auswählen.

Jetzt können Sie mit der rechten Maustaste auf die Datenbank klicken, in der Sie Ihre Tabelle hinzufügen möchten, und Aufgaben> Importieren auswählen.

Der Import-Export-Assistent wird geöffnet und als Nächstes ausgewählt. Wählen Sie Microsoft Excel als Eingabedatenquelle aus, durchsuchen Sie die zuvor gespeicherte XLS-Datei und wählen Sie sie aus.

Wählen Sie nun den Zielserver und auch die bereits erstellte Zieltabelle aus.

Hinweis: Wenn ein identitätsbasiertes Feld vorhanden ist, möchten Sie in der Zieltabelle möglicherweise die Identitätseigenschaft entfernen, da diese Daten ebenfalls eingefügt werden. Wenn Sie diese also nur als Identitätseigenschaft hätten, würde der Importvorgang fehlschlagen.

Klicken Sie jetzt auf Weiter und dann auf Fertig stellen. Es wird angezeigt, wie viele Datensätze importiert werden, und der Erfolg wird zurückgegeben, wenn keine Fehler auftreten.

sinod
quelle
Das Wichtigste für mich hier war, die zu exportierenden Daten selektiv auswählen zu können
Peter M
0

Eine weitere Option, wenn Sie sie zur Verfügung haben: c # .net. Insbesondere der Microsoft.SqlServer.Management.Smo-Namespace.

Ich verwende Code ähnlich dem folgenden in einer Skriptkomponente eines meiner SSIS-Pakete.

var tableToTransfer = "someTable";
var transferringTableSchema = "dbo";

var srvSource = new Server("sourceServer");
var dbSource = srvSource.Databases["sourceDB"];

var srvDestination = new Server("destinationServer"); 
var dbDestination = srvDestination.Databases["destinationDB"];

var xfr = 
    new Transfer(dbSource) {
        DestinationServer = srvDestination.Name,
        DestinationDatabase = dbDestination.Name,
        CopyAllObjects = false,
        DestinationLoginSecure = true,
        DropDestinationObjectsFirst = true,
        CopyData = true
    };

xfr.Options.ContinueScriptingOnError = false; 
xfr.Options.WithDependencies = false; 

xfr.ObjectList.Add(dbSource.Tables[tableToTransfer,transferringTableSchema]);
xfr.TransferData();

Ich glaube, ich musste explizit nach der Microsoft.SqlServer.Smo-Bibliothek suchen und sie zu den Referenzen hinzufügen. Aber abgesehen davon hat das für mich geklappt.

Update : Der Namespace und die Bibliotheken waren komplizierter als ich mich erinnerte.

Fügen Sie für Bibliotheken Verweise hinzu auf:

  • Microsoft.SqlServer.Smo.dll
  • Microsoft.SqlServer.SmoExtended.dll
  • Microsoft.SqlServer.ConnectionInfo.dll
  • Microsoft.SqlServer.Management.Sdk.Sfc.dll

Fügen Sie für die Namespaces Folgendes hinzu:

  • Microsoft.SqlServer.Management.Common
  • Microsoft.SqlServer.Management.Smo
pwilcox
quelle