BULK INSERT à partir d'une table à l'autre sur le serveur
J'ai copier un tas de données provenant d'une table de base de données dans un autre. Je ne peux pas utiliser SELECT ... INTO parce que l'une des colonnes est une colonne d'identité. Aussi, j'ai quelques modifications à apporter au schéma. J'ai été en mesure d'utiliser l'assistant d'export de données pour créer un package SSIS, que j'ai ensuite modifié dans Visual Studio 2005 pour apporter les modifications souhaitées et autres joyeusetés. C'est certainement plus rapide qu'un INSERT INTO, mais il semble ridicule à moi de télécharger les données vers un autre ordinateur pour télécharger de nouveau. (En supposant que je ne suis bon qu'est ce que le package SSIS est en train de faire). Est-t-il un équivalent à l'instruction BULK INSERT qui s'exécute directement sur le serveur, permet de garder les valeurs d'identité et extrait les données d'une table? (autant que je peux dire, BULK INSERT ne peut récupérer des données à partir d'un fichier)
Edit:
Je ne sais à propos de IDENTITY_INSERT, mais parce qu'il ya une bonne quantité de données concernées, INSERT ... SELECT est un peu lent. SSIS/BULK INSERT exporte les données dans la table sans égard à l'index et forestières, et autres joyeusetés, il est donc plus rapide. (Bien sûr, la création de l'index cluster sur la table une fois qu'elle est remplie n'est pas rapide, mais c'est toujours plus rapide que l'INSERT...SELECT que j'ai essayé dans ma première tentative)
Edit 2:
Le schéma changements incluent (mais ne sont pas limités à) les éléments suivants:
1. Diviser un tableau en deux nouvelles tables. Dans le futur, chacun aura sa propre colonne d'IDENTITÉ, mais pour la migration, je pense qu'il sera plus simple d'utiliser l'identité de la table d'origine comme identité pour les deux nouvelles tables. Une fois la migration sur l'une des tables aura un un-à-plusieurs relation à l'autre.
2. Déplacer les colonnes d'un tableau à l'autre.
3. La suppression de certains tableaux de correspondance, que seule la croix référencé 1-pour-1. Au lieu de cela, la référence sera une clé étrangère dans l'une des deux tables.
4. Quelques nouvelles colonnes sera créé avec les valeurs par défaut.
5. Certaines tables ne changent pas du tout, mais j'ai de les copier sur en raison de la "mettre le tout dans une nouvelle bd" demande.
OriginalL'auteur stannius | 2009-07-29
Vous devez vous connecter pour publier un commentaire.
Je pense que vous pouvez être intéressé par L'Identité Insérer
OriginalL'auteur Ryan Ische
Je pense SELECT...INTO devrait travailler avec une colonne d'IDENTITÉ. Vous devrez peut-être redéfinir la clé primaire:
Si cela ne fonctionne pas, vous pouvez générer un script de création de TABLE pour la table ancienne, de changer le nom pour créer la nouvelle table, puis utilisez IDENTITY_INSERT pour permettre de copier les données de clé primaire de la première table à l'aide d'une INSERTION DANS Nouvelletable SÉLECTIONNEZ à PARTIR de OLDTABLE. Ensuite, vous pouvez faire votre autre manipulation sur le serveur SQL.
Un belle avantage est que vous pouvez tester ce script en local ou sur un serveur de test, et répéter si besoin est juste de ré-exécuter le script.
Sont vos modifications de schéma trop complexe pour permettre le changement via le script?
OriginalL'auteur Jon Galloway
Veuillez vérifier avec cela,
OriginalL'auteur Md Tariq-ul Islam
Depuis de si nombreuses personnes ont regardé cette question, je pensais que je devrais suivre.
J'ai fini par coller avec le package SSIS. J'ai exécuté sur le serveur de base de données elle-même. Elle est passée par le galimatias de l'extraction de données de la le processus sql à la SSIS, puis l'envoyer en arrière. Mais dans l'ensemble il a exécuté plus rapidement que d'autres options que j'ai étudié.
Aussi, je suis tombé sur un bug: lors de l'extraction de données à partir d'une vue, le colis serait juste l'accrocher. J'ai fini par couper et de coller la requête de l'afficher directement dans la "requête sql" champ de la "source" de l'objet dans SSIS. Cela ne semblait se produire lorsque l'emballage a été en cours d'exécution sur la même machine que le serveur. Lors de l'exécution à partir d'un autre ordinateur, je n'ai pas cette erreur.
Si je devais tout recommencer, je serais probablement générer de nouvelles valeurs d'identité. Je voudrais migrer les anciens à une colonne dans la nouvelle table, utilisez ces valeurs pour associer les autres tables pour les clés étrangères, et puis je voudrais supprimer la colonne une fois la migration terminée et stable. D'autre part, dans l'ensemble, le package SSIS méthode a bien fonctionné, donc si vous devez faire une migration complexe (fractionnement des tables etc.) ou le besoin de conserver les valeurs d'identité intacte, je le recommande.
Merci à tous ceux qui ont répondu.
OriginalL'auteur stannius