338 votes

Copier des tables d'une base de données à une autre dans SQL Server

J'ai une base de données appelée foo et une base de données appelée bar. J'ai une table dans foo appelée tblFoobar que je veux déplacer (données et tout) vers la base de données bar depuis la base de données foo. Quelle est l'instruction SQL à utiliser pour ce faire ?

544voto

David Points 2901

La tâche "Importer des données" de SQL Server Management Studio (cliquez avec le bouton droit de la souris sur le nom de la base de données, puis sur les tâches) fera la plupart de ces opérations pour vous. Exécutez-la à partir de la base de données dans laquelle vous voulez copier les données.

Si les tables n'existent pas, il les créera pour vous, mais vous devrez probablement recréer tous les index et autres. Si les tables existent, il ajoutera les nouvelles données par défaut mais vous pouvez ajuster cela (modifier les mappings) pour qu'il supprime toutes les données existantes.

Je l'utilise tout le temps et il fonctionne assez bien.

1 votes

Je n'arrive pas à trouver cette option. Y a-t-il une version spécifique ?

37 votes

On ne peut pas vraiment dire que c'est une meilleure réponse en général. Il est inutilisable pour l'automatisation d'être appelé à partir d'un script par exemple. BTW l'auteur a demandé spécifiquement une "..déclaration SQL..". Mais bien sûr, c'est une excellente réponse, mais pas une meilleure ;).

3 votes

L'auteur demandait de déplacer "(les données et tout)" ; j'espérais donc que cette réponse y parviendrait. Elle crée la table mais ne crée pas de clés ou d'index ; donc pas beaucoup d'amélioration par rapport à la réponse SQL.

218voto

David B Points 53123

Sur SQL Server ? et sur le même serveur de base de données ? Utilisez un nommage en trois parties.

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

Cela déplace juste les données. Si vous voulez déplacer la définition de la table (et d'autres attributs tels que les permissions et les index), vous devrez faire autre chose.

0 votes

Vous devrez également définir séparément les autorisations de table, je crois.

1 votes

Si vous avez besoin de faire des insertions d'identité également, l'Assistant d'Importation de Données a une option pour cela ^^ - en se référant à l'autre réponse

13 votes

@TahaRehmanSiddiqui : Parce que cela répond à la question ;) Il n'a pas demandé comment le copier entre les serveurs de base de données. Mais la plupart des gens qui cherchent cette réponse finissent ici, parce que Google la donne comme premier résultat :)

115voto

leoinfo Points 3364

Cela devrait fonctionner :

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

Elle pas copier des contraintes, des valeurs par défaut ou des index. La table créée sera pas ont un index en grappe.

Vous pouvez aussi le faire :

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

Si votre table de destination existe et est vide.

0 votes

Y a-t-il un problème si l'on copie d'abord la structure de la table de base (champs et données) et que l'on applique ensuite une méthode d'application de l'outil d'analyse des données. patch script pour créer des permissions, des index, des contraintes et des propriétés étendues ?

4 votes

Cela ne permet pas d'insérer des valeurs pour les colonnes d'identité dans SQL Server 2008. Cela n'est autorisé que si vous utilisez une liste de colonnes et que IDENTITY_INSERT est activé pour la table de destination.

0 votes

@Lucas - Vous avez "à moitié" raison :). Cependant, la première instruction SQL copie TOUTES les données, y compris les valeurs des colonnes d'identité. Comme je l'ai dit, les contraintes ne sont pas créées. Mais elles peuvent être facilement scriptées sur la BD source et appliquées à la BD de destination une fois que toutes les données sont déplacées.

47voto

Igor Voplov Points 588

S'il s'agit d'une seule table, tout ce que vous devez faire est

  • Définition de la table script.
  • Créer une nouvelle table dans une autre base de données
  • Mise à jour des règles, des index, des permissions, etc.
  • Importer des données (plusieurs exemples d'insertion dans sont déjà montrés ci-dessus)

Vous devrez envisager d'autres mises à jour, comme la migration d'autres objets, à l'avenir. Notez que vos tables source et destination n'ont pas le même nom. Cela signifie que vous devrez également effectuer des modifications si vous dépendez d'objets tels que des vues, des procédures stockées et autres.

Avec un ou plusieurs objets, vous pouvez procéder manuellement sans problème. Cependant, lorsqu'il y a plus que quelques mises à jour, les outils de comparaison tiers sont très utiles. En ce moment, j'utilise ApexSQL Diff pour les migrations de schémas, mais vous ne pouvez vous tromper avec aucun autre outil.

23voto

ScottStonehouse Points 6513
  1. script la create table dans management studio, exécuter ce script en barre pour créer la table. (Clic droit sur la table dans l'explorateur d'objets, script table as, create to...)

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

1 votes

J'aime cette approche. Select * ne fonctionnera pas s'il y a une colonne d'identité, vous devrez lister explicitement les noms des colonnes. Vous devrez également faire SET IDENTITY_INSERT TblName ON dans ce cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X