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

325

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 (les données et tout) vers la barre de base de données depuis la base de données foo. Quelle est l'instruction SQL pour ce faire?

RyanKeeter
la source

Réponses:

208

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

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

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

Amy B
la source
Vous devrez également définir séparément les autorisations de table, je crois.
Ken Ray
1
Si vous devez également effectuer des insertions d'identité, l'assistant d'importation de données a une option pour cela ^^ - en se référant à l'autre réponse
Clarence Liu
13
@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 recherchent cette réponse se retrouvent ici, car google le donne comme premier résultat :)
Maarten Kieft
1
@RyanB oui, c'est autorisé.
Amy B
1
@Tom OP et de nombreuses personnes qui viennent à cette question recherchent une "instruction SQL", pas un outil.
Amy B
535

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

Si les tables n'existent pas, elles seront créées 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 les ajuster (modifier les mappages) afin de supprimer toutes les données existantes.

Je l'utilise tout le temps et ça marche assez bien.

David
la source
1
je n'arrive pas à trouver cette option. y a-t-il quelque chose de spécifique ici?
Nerrve
35
Vous ne pouvez pas vraiment dire que c'est une meilleure réponse en général. Par exemple, il est inutilisable d'appeler l'automatisation à partir d'un script. 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;).
grizzly
3
L'auteur a demandé de déplacer "(données et tout)"; alors j'espérais que cette réponse ferait ça. Il crée la table mais ne crée aucune clé ni index; donc pas beaucoup d'amélioration par rapport à la réponse SQL.
unubar
Est-il possible de spécifier une WHEREcondition à l'aide de la tâche Importer des données? Je n'ai pas réussi à trouver un moyen de le faire.
écraser le
1
oui c'est la manière correcte comme mentionné ici aussi, mais identityet les foreign keyréférences sont supprimées dans la base de données de destination, une solution?
shaijut
106

Cela devrait fonctionner:

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

Il ne copiera pas les contraintes, les valeurs par défaut ou les index. La table créée ne sera pas d'index cluster.

Vous pouvez également:

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

Si votre table de destination existe et est vide.

leoinfo
la source
Existe-t-il un problème si vous copiez d'abord la structure de la table de base (champs et données) puis appliquez un script de correctif pour créer des autorisations, des index, des contraintes et des propriétés étendues?
leoinfo
4
Cela n'insérera pas de valeurs pour les colonnes d'identité dans SQL Server 2008. Cela n'est autorisé que lorsque vous utilisez une liste de colonnes et que IDENTITY_INSERT est ON pour la table de destination.
Lucas Wilson-Richter
@Lucas - Vous avez "moitié" raison :). Cependant, la première instruction SQL copie TOUTES les données, y compris les valeurs dans les colonnes d'identité. Comme je l'ai dit, les contraintes ne sont pas créées. Mais ils peuvent être facilement scriptés sur la base de données source et appliqués à la base de données de destination une fois toutes les données déplacées.
leoinfo
La deuxième version ( INSERT INTO...) a fonctionné pour moi dans Oracle.
vapcguy
Est-ce que cela fonctionne si les 2 bases de données sont sur des serveurs totalement différents avec des chaînes de connexion différentes? Sinon, comment gérez-vous cela?
Alexander Ryan Baggett
46

Si c'est une seule table, alors tout ce que vous devez faire est

  • Définition de table de script
  • Créer une nouvelle table dans une autre base de données
  • Mettre à jour les règles, les index, les autorisations et autres
  • Importer des données (plusieurs insertions dans des exemples sont déjà montrées ci-dessus)

Une chose que vous devrez considérer est d'autres mises à jour telles que 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 apporter 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 aller manuellement sans aucun 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éma, mais vous ne pouvez pas vous tromper avec un autre outil.

Igor Voplov
la source
23
  1. Créez un script create tabledans le studio de gestion, exécutez ce script dans la barre pour créer la table. (Table de clic droit dans l'explorateur d'objets, table de script as, create to ...)

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

ScottStonehouse
la source
1
J'aime cette approche. Sélectionnez * ne fonctionnera pas s'il existe une colonne d'identité, vous devrez répertorier explicitement les noms de colonne. Vous devrez également le faire SET IDENTITY_INSERT TblName ONdans ce cas.
JeremyWeir
16

Vous pouvez également utiliser l' Assistant Générer des scripts SQL Server pour guider la création de scripts SQL pouvant effectuer les opérations suivantes:

  • copier le schéma de la table
  • toutes les contraintes (identité, valeurs par défaut, etc.)
  • données dans le tableau
  • et bien d'autres options si besoin

Bon exemple de flux de travail pour SQL Server 2008 avec des captures d'écran illustrées ici .

ryan
la source
Voir mes commentaires ci-dessus: "Comment cela a-t-il obtenu 508/171 votes et Ryan" 11 oct. 11 à 23:41 "Réponse obtenir seulement 13 à ce jour?!? Ryan est la seule réponse que la réponse est complètement le q de l'op . Parce qu'il gère ces scénarios (que, entre-temps, l'OP N'EXCLUT PAS de son q.): a) Identité ( très courante), b) Contraintes, c) Déclencheurs, d) Index, e) Autorisations, d) Copie du schéma ET des données ( Astuce: la partie "et tout" des op "(données et tout)" implique également le schéma.) Et e) génère des "instructions SQL" que l'op a spécifiées qui, même s'il ne voulait pas dire qu'il est littéralement préférable d'avoir que non. ".
Tom
1
Remarque: Cette réponse n'est pratique que lorsque le nombre de lignes n'est pas «excessif» (c'est-à-dire les tables de recherche / petites transactions) et aucune valeur de colonne «grande». Pour ceux-ci, j'utiliserais la réponse de Ryan juste pour générer le script pour la création de la table (y compris les attributs de colonne et les sous-objets), puis j'utiliserais la réponse "Insérer dans la sélection" de David B. Pour les tables simples (au lieu de Ryan A), vous pouvez également utiliser SSMS, l'Explorateur d'objets, la table de clic droit, la table de script as, CREATE To, mais vous devez d'abord vous assurer que les outils, les options, l'explorateur d'objets SQL Server et les options de script sont régler comme vous le souhaitez.
Tom
9

Vous pouvez suivre cette voie: (un exemple général)

insert into QualityAssuranceDB.dbo.Customers (columnA, ColumnB)
Select columnA, columnB from DeveloperDB.dbo.Customers

De plus, si vous devez également générer les noms de colonnes pour insérer une clause d'insertion, utilisez:

    select (name + ',') as TableColumns from sys.columns 
where object_id = object_id('YourTableName')

Copiez le résultat et collez-le dans la fenêtre de requête pour représenter les noms de vos colonnes de table et même cela exclura également la colonne d'identité:

    select (name + ',') as TableColumns from sys.columns 
where object_id = object_id('YourTableName') and is_identity = 0

N'oubliez pas que le script pour copier les lignes fonctionnera si les bases de données appartiennent au même emplacement.


Vous pouvez l'essayer.

select * into <Destination_table> from <Servername>.<DatabaseName>.dbo.<sourceTable>

Le nom du serveur est facultatif si les deux bases de données se trouvent sur le même serveur.

NeverHopeless
la source
1

S'il existe une table existante et que nous voulons copier uniquement les données, nous pouvons essayer cette requête.

insérer dans Destination_Existing_Tbl sélectionner col1, col2 FROM Source_Tbl

Mohan
la source
0

Copier les données

INSERT INTO Alfestonline..url_details(url,[status],recycle) 
SELECT url,status,recycle FROM AlfestonlineOld..url_details
Arun Prasad ES
la source