écraser la table avec les données d'une autre table - SQL


9

Nos utilisateurs veulent actualiser une base de données QA à partir de la production mais veulent deux tables (appelons-les T1 et T2) pour conserver les données QA d'origine. J'ai donc copié deux tables de QA (DB1) dans une base de données temporaire QA (DB2). Puis DB1 actualisé de la production. Après l'actualisation, je souhaite écraser les données T1 et T2 de DB2 vers DB1 afin qu'elles puissent contenir des valeurs d'assurance qualité avant actualisation.

J'ai fait ce qui suit:

  1. Utilisation

    select * 
    INTO D1.dbo.T1
    FROM D2.dbo.T1
  2. Puis D1 rafraîchi de prod

  3. Tronquez ensuite T1 avec l'étape suivante:

    SELECT COUNT(*) AS BeforeTruncateCount
    FROM T1;
    GO
    TRUNCATE TABLE T1;
    GO
    SELECT COUNT(*) AS AfterTruncateCount
    FROM T1;
    GO
  4. Maintenant, lorsque je reviens pour copier les données de D2.T1 vers D1.T1, j'obtiens l'erreur qu'il existe déjà un objet nommé T1 dans la base de données.

Dois-je laisser tomber la table et copier?

Ou existe-t-il une meilleure méthode pour toute la procédure?

Réponses:


6

Pour combiner les réponses de @Kin et @DavidSpillett.

D'abord une hypothèse. DB1 et DB2 sont sur la même instance. Cela ressemble certainement à ce qu'ils sont, mais cela ne fait jamais de mal de dire l'évidence (d'autant plus que je me suis trompé avec ce que je pensais être évident auparavant.)

Étant donné que, si les données sont volumineuses, disons plusieurs millions de lignes, utilisez un package SSIS. Cela a une fonctionnalité spécifique que vous voudrez utiliser. Vous pouvez spécifier une taille de lot. De cette façon, la taille de votre transaction sera plus petite. L'inconvénient du package SSIS est qu'il ajoute un niveau de complexité à votre processus. Ce n'est pas un grand, mais si vous travaillez avec une petite table, vous n'en avez pas besoin.

Ce qui nous amène à l'autre option. Si toutefois les données sont de l'ordre de plusieurs centaines de milliers ou plus petites, utilisez un code comme celui-ci.

USE D1;
GO
TRUNCATE TABLE dbo.T1;
GO
INSERT INTO D1.dbo.T1
SELECT * 
FROM D2.dbo.T1;
GO

Et enfin et surtout si c'est quelque part sur le pensionnaire, j'essaierais les deux et verrais ce qui fonctionne le mieux pour vous.

Remarque: vous pouvez également envisager de ne pas utiliser un SELECT *sur INSERT INTOet spécifier une liste de champs à la place.

Cette structure ressemblerait à ceci

INSERT INTO D1.dbo.T1 (Field1, Field2)
SELECT Field1, Field2
FROM D2.dbo.T1;

Merci pour l'info. Oui, la table n'a que 7800 lignes, elle est donc assez petite et sur la même instance. J'ai essayé d'utiliser INSERT INTO (sans sélection) et cela a parfaitement fonctionné. Merci de partager cela. J'ai également testé avec Import Data avec SSMS. Cela a très bien fonctionné aussi.
Rizwan

1
Sachez que vous devrez spécifier une liste de champs (et ne pas l'utiliser *) s'il y a un champ d'indentité dans la table - ces valeurs ne peuvent pas simplement être "copiées".
Conrad

6

IIRC avec la SELECT <stuff> INTO <target> FROM ...syntaxe SQL Server suppose toujours que vous souhaitez créer la table de destination à partir de zéro. Lorsque la table existe déjà, essayez à la INSERT <target> SELECT <stuff> FROM ...place.


5
De plus, la réponse de David est également meilleure route qu'un DROP et SELECT INTO lors du déplacement des données vers D1, car si vous supprimiez les tables D1, vous perdriez tous les objets enfants (c.-à-d. Clés étrangères, clés primaires, déclencheurs, etc. )
Delux

2
Je suis d'accord avec @Delux. Une autre chose importante que vous perdrez est les autorisations explicites. Si un utilisateur dispose d'autorisations spécifiques à cette table (plutôt que de dire db_datareader), si vous supprimez la table, vous perdez ces autorisations.
Kenneth Fisher

C'est une excellente astuce. Je ne comprenais pas les ramifications de DROP jusqu'à présent. Je vous remercie!
Rizwan

6

Le mieux est d'utiliser SSIS (importation / exportation de données) pour ce faire. Il a la fonctionnalité de simplement transférer les tables sélectionnées de la source à la destination. En option, vous pouvez même enregistrer le package afin qu'il puisse être réutilisé pour des transferts futurs / répétés.

EDIT: Ajout de plus de captures d'écran pour plus de clarté.

entrez la description de l'image ici

entrez la description de l'image ici

entrez la description de l'image ici

entrez la description de l'image ici

entrez la description de l'image ici


wow .. merci pour les superbes captures d'écran .. elles sont d'une grande aide
Rizwan

Excellente solution, de belles captures d'écran fonctionnent!
Mayer Spitzer
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.