web-dev-qa-db-fra.com

Exporter les données d'une table d'un serveur SQL vers un autre

J'ai deux serveurs SQL (version 2005 tous les deux).

Je souhaite migrer plusieurs tables de l'une à l'autre.

J'ai essayé:

  • Sur le serveur source, j'ai cliqué avec le bouton droit sur la base de données et sélectionné Tasks/Generate scripts. Le problème est que, sous Table/View options, il n'y a pas d'option Script data.

  • Ensuite, j'ai utilisé Script Table As/Create script pour générer des fichiers SQL afin de créer les tables sur mon serveur de destination. Mais j'ai toujours besoin de toutes les données.

Puis j'ai essayé d'utiliser:

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

Mais j'obtiens une erreur:

L'objet contient plus que le nombre maximal de préfixes. Le maximum est 2.

Est-ce que quelqu'un peut m'indiquer la bonne solution à mon problème?

49
no9

Essaye ça:

  1. créez votre table sur le serveur cible en utilisant vos scripts de l'étape Script Table As / Create Script

  2. sur le serveur cible, vous pouvez ensuite émettre une instruction T-SQL:

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

Cela devrait bien fonctionner.

52
marc_s

Juste pour montrer encore une autre option (pour SQL Server 2008 et supérieur):

  1. faites un clic droit sur Base de données -> sélectionnez "Tâches" -> sélectionnez "Générer des scripts".
  2. Sélectionnez les objets de base de données spécifiques que vous souhaitez copier. Disons une ou plusieurs tables. Cliquez sur Suivant
  3. Cliquez sur Avancé et faites défiler jusqu'à «Types de données à écrire» et choisissez «Schéma et données». Cliquez sur OK
  4. Choisissez où sauvegarder le script généré et continuez en cliquant sur Suivant
36
Konstantin

Il y a une option de table de script dans Tasks/Generate scripts! J'ai aussi manqué au début! Mais vous pouvez y générer des scripts d’insertion (fonctionnalité très agréable, mais à la place très peu intuitive).

Lorsque vous arrivez à l'étape "Définir les options de script", cliquez sur l'onglet "Avancé". 

Étapes décrites ici (les images peuvent comprendre, mais j’écris en letton là-bas).

9
Jānis

Essayez d’utiliser SQL Server Importer et exporter Wizard (sous Tâches -> Exporter des données).

Il propose de créer les tables dans la base de données de destination. Comme vous l'avez vu, l'assistant de script ne peut créer que la structure du tableau.

6

Si les tables sont déjà créées à l'aide des scripts, il existe un autre moyen de copier les données en utilisant la commande BCP pour copier toutes les données de votre serveur source sur votre serveur de destination. 

Pour exporter les données de la table dans un fichier texte sur le serveur source:

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

Pour importer les données de la table à partir d'un fichier texte sur le serveur cible:

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

Juste pour les coups de pied.

Depuis que je n'ai pas pu créer de serveur lié et que se connecter à un serveur de production ne suffisait pas pour utiliser INSERT INTO, j'ai procédé comme suit:

  • créé une sauvegarde de la base de données du serveur de production
  • restauré la base de données sur mon serveur de test
  • exécuté l'insertion dans des déclarations

C'est une solution de porte dérobée, mais depuis que j'ai eu des problèmes cela a fonctionné pour moi.

Depuis que j'ai créé des tables vides en utilisant SCRIPT TABLE AS / CREATE afin de transférer toutes les clés et tous les index, je ne pouvais pas utiliser SELECT INTO. SELECT INTO ne fonctionne que si les tables n'existent pas sur l'emplacement de destination mais ne copie pas les clés ni les index, vous devez donc le faire manuellement. L'inconvénient de l'utilisation de l'instruction INSERT INTO est que vous devez fournir manuellement tous les noms de colonnes. De plus, cela pourrait vous causer des problèmes si certaines contraintes de clé étrangère échouent.

Merci à toutes les réponses, il existe de bonnes solutions, mais j’ai décidé d’accepter la réponse de marc_s.

2
no9

Cela peut être fait via "Import/Export Data ..." dans SQL Server Management Studio

2
Vil

Vous ne pouvez pas choisir un serveur source/destination.

Si les bases de données sont sur le même serveur, vous pouvez le faire:

Si les colonnes de la table sont égales (y compris l'ordre!), Vous pouvez le faire:

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

Si vous voulez le faire une fois, vous pouvez sauvegarder/restaurer la base de données source . Si vous devez le faire plus souvent, je vous recommande de démarrer un projet SSIS dans lequel vous définissez la base de données source (vous pouvez choisir n'importe quelle connexion sur n'importe quel serveur). et créez un projet dans lequel vous y déplacerez vos données . Voir plus d'informations ici: http://msdn.Microsoft.com/en-us/library/ms169917%28v=sql.105%29.aspx

2
YvesR

C'est en quelque sorte une solution de contournement, mais cela a fonctionné pour moi. J'espère que cela fonctionne également pour ce problème:

Vous pouvez exécuter la requête SQL de sélection sur la table que vous souhaitez exporter et enregistrer le résultat au format .xls dans votre lecteur.

Créez maintenant la table à laquelle vous souhaitez ajouter des données avec toutes les colonnes et tous les index. Cela peut être facilement fait avec un clic droit sur la table et en sélectionnant l'option Créer pour le script.

Vous pouvez maintenant cliquer avec le bouton droit de la souris sur la base de données dans laquelle vous souhaitez ajouter votre table et sélectionner Tâches> Importer.

L'assistant d'importation et d'exportation s'ouvre et sélectionnez suivant. Sélectionnez Microsoft Excel comme source de données d'entrée, puis recherchez et sélectionnez le fichier .xls que vous avez précédemment enregistré.

Maintenant, sélectionnez le serveur de destination et la table de destination que nous avons déjà créée.

Remarque: S'il existe un champ basé sur l'identité, dans la table de destination, vous voudrez peut-être supprimer la propriété d'identité car ces données seront également insérées. Donc, si vous aviez uniquement celle-ci comme propriété Identity, le processus d'importation serait une erreur.

Cliquez ensuite sur suivant, puis sur terminer. Il vous indiquera le nombre d'enregistrements importés et renverra le test si aucune erreur ne se produit.

1
sinod

Pour copier des données de la source à la destination:

use <DestinationDatabase>
select * into <DestinationTable> from <SourceDataBase>.dbo.<SourceTable>
1
David Brabant

Encore une autre option si vous l’avez disponible: c # .net. En particulier, l'espace de noms Microsoft.SqlServer.Management.Smo.

J'utilise un code semblable au suivant dans un composant de script de l'un de mes packages SSIS. 

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();

Je pense que je devais explicitement rechercher et ajouter la bibliothèque Microsoft.SqlServer.Smo aux références. Mais en dehors de cela, cela a fonctionné pour moi.

Mettre à jour: L'espace de noms et les bibliothèques étaient plus compliqués que dans mes souvenirs.

Pour les bibliothèques, ajoutez des références à:

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

Pour les espaces de noms, ajoutez:

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

Si vous n'êtes pas autorisé à lier des serveurs, voici les étapes à suivre pour importer une table d'un serveur à un autre à l'aide de l'Assistant d'importation/exportation de serveur SQL:

  • Cliquez avec le bouton droit sur la base de données source à partir de laquelle vous souhaitez copier.
  • Sélectionnez Tâches - Exporter les données.
  • Sélectionnez Sql Server Native Client dans la source de données.
  • Sélectionnez votre type d'authentification (authentification SQL Server ou Windows).
  • Sélectionnez la base de données source.
  • Ensuite, choisissez la destination: Sql Server Native Client
  • Tapez votre nom de serveur (le serveur sur lequel vous voulez copier le tableau).
  • Sélectionnez votre type d'authentification (authentification SQL Server ou Windows).
  • Sélectionnez la base de données de destination.
  • Sélectionnez Copier les données.
  • Sélectionnez votre table dans la liste.
  • Cliquez sur Suivant, sélectionnez Exécuter immédiatement ou éventuellement, vous pouvez également enregistrer le package dans un fichier ou sur Sql Server si vous souhaitez l'exécuter ultérieurement.
  • Terminer
0
live-love