SQL Server - Créer une copie d'une table de base de données et la placer dans la même base de données?

108

J'ai une table ABC dans une base de données DB. Je souhaite créer des copies d'ABC avec les noms ABC_1, ABC_2, ABC_3 dans le même DB. Comment puis-je faire cela en utilisant Management Studio (de préférence) ou des requêtes SQL?

Ceci est pour SQL Server 2008 R2.

sequel.learner
la source
1
un autre article non directement lié, mais peut être lié au cas d'utilisation ci-dessus - stackoverflow.com/questions/6810425/… cela peut être utile lorsque vous souhaitez modifier les copies de la table (par exemple, autoriser les valeurs nulles, modifier le type de données, etc. .) sans avoir à recréer les copies.
sequel.learner

Réponses:

212

Utilisez SELECT ... INTO:

SELECT *
INTO ABC_1
FROM ABC;

Cela créera une nouvelle table ABC_1qui a la même structure de colonne que ABCet contient les mêmes données. Les contraintes (par exemple les clés, les valeurs par défaut), cependant, ne sont pas copiées.

Vous pouvez exécuter cette requête plusieurs fois avec un nom de table différent à chaque fois.


Si vous n'avez pas besoin de copier les données, uniquement pour créer une nouvelle table vide avec la même structure de colonnes, ajoutez une WHEREclause avec une expression erronée:

SELECT *
INTO ABC_1
FROM ABC
WHERE 1 <> 1;
Mahmoud Gamal
la source
3
Réponse parfaite à mon problème.
sequel.learner
8
Ne fonctionne pas complètement ... les colonnes calculées dans l'original ne sont pas copiées de la même manière dans la cible. De plus, les contraintes PK et Default ne sont pas copiées non plus
Simon Green
@SimonGreen - Vous pouvez poster une nouvelle question pour ce problème avec votre code.
Mahmoud Gamal
3
Bien sûr, cela ne fonctionne pas complètement. Il a averti que les contraintes ne sont pas copiées, pas plus que les clés primaires ou les valeurs par défaut. La commande qu'il propose crée une nouvelle table avec la même structure de colonnes (comme il l'a dit) et insère toutes les données dans la nouvelle table pour vous.
user5855178
1
Je trouve utiliser SELECT TOP(0) *plus propre que la WHEREméthode de déclaration toujours fausse
Thymine
21

Copier le schéma (générer DDL) via l'interface utilisateur SSMS

Dans SSMS, développez votre base de données dans l' Explorateur d'objets , allez dans Tables , cliquez avec le bouton droit sur la table qui vous intéresse et sélectionnez Script Table As , Create To , New Query Editor Window . Faites une recherche et remplacez ( CTRL + H ) pour changer le nom de la table (c.-à-d. Mettez ABCdans le champ Rechercher et ABC_1dans le Remplacer par puis cliquez sur OK ).

Copier le schéma via T-SQL

Les autres réponses montrant comment faire cela par SQL fonctionnent également bien, mais la différence avec cette méthode est que vous obtiendrez également des index, des contraintes et des déclencheurs.

Copier les données

Si vous souhaitez inclure des données, après avoir créé cette table, exécutez le script ci-dessous pour copier toutes les données d'ABC (en conservant les mêmes valeurs d'ID si vous avez un champ d'identité):

set identity_insert ABC_1 on
insert into ABC_1 (column1, column2) select column1, column2 from ABC
set identity_insert ABC_1 off
JohnLBevan
la source
1
Êtes-vous sûr que cette méthode copie également les index? Je l'ai essayé et non.
BornToCode
3
Vous devez définir IDENTITY_INSERTsur ON pour permettre de définir la colonne d'identité "manuellement", vous avez mélangé l'ordre dans votre exemple. Aussi, vous devez EXPLICITER la liste de vos colonnes
jean
2
Merci @jean; bien repéré après 6 ans inaperçu! Fixé.
JohnLBevan
Cela a presque résolu le problème pour moi. La dernière astuce est que vous pouvez faire glisser le dossier "Colonnes" de l'arborescence de SSMS dans l'éditeur pour obtenir une liste de colonnes. J'ai une colonne d'horodatage sur chaque table, j'ai donc dû obtenir la liste des colonnes, puis supprimer l'horodatage.
Wade Hatler
10

Si vous souhaitez dupliquer la table avec toutes ses contraintes et clés, procédez comme suit:

  1. Ouvrez la base de données dans SQL Management Studio.
  2. Cliquez avec le bouton droit sur la table que vous souhaitez dupliquer.
  3. Sélectionnez Script Table as -> Create to -> New Query Editor Window. Cela générera un script pour recréer la table dans une nouvelle fenêtre de requête.
  4. Modifiez le nom de la table et les clés et contraintes relatives dans le script.
  5. Exécutez le script.

Ensuite, pour copier les données, exécutez ce script ci-dessous:

SET IDENTITY_INSERT DuplicateTable ON

INSERT Into DuplicateTable ([Column1], [Column2], [Column3], [Column4],... ) 
SELECT [Column1], [Column2], [Column3], [Column4],... FROM MainTable

SET IDENTITY_INSERT DuplicateTable OFF
Rousonur Jaman
la source
4

1ère option

select *
  into ABC_1
  from ABC;

2ème option: utiliser SSIS, c'est-à-dire faire un clic droit sur la base de données dans l'explorateur d'objets> toutes les tâches> exporter les données

  • source et cible: votre base de données
  • table source: ABC
  • table cible: ABC_1 (la table sera créée)
Claude
la source
2

Voici une autre option:

select top 0 * into <new_table> from <original_table>
Keni
la source
2
Cette demande copie la table sans données. L'utilisateur a demandé du tout à copier les tables.
Alekzander
1

utilisez sql server manegement studio ou netcat et cela sera plus facile à manipuler sql

gasroot
la source
1

Vous devez écrire SSIS pour copier la table et ses données, contraintes et déclencheurs. Nous avons dans notre organisation un logiciel appelé Kal Admin de kalrom Systems qui a une version gratuite à télécharger (je pense que la fonction de copie des tableaux est facultative)

Chris D
la source