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?
Essaye ça:
créez votre table sur le serveur cible en utilisant vos scripts de l'étape Script Table As / Create Script
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.
Juste pour montrer encore une autre option (pour SQL Server 2008 et supérieur):
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).
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.
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>
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:
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.
Cela peut être fait via "Import/Export Data ..." dans SQL Server Management Studio
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
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.
Pour copier des données de la source à la destination:
use <DestinationDatabase>
select * into <DestinationTable> from <SourceDataBase>.dbo.<SourceTable>
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 à:
Pour les espaces de noms, ajoutez:
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: