2010-04-07 15 views
1

J'ai une situation dans laquelle je dois copier une partie des données d'un serveur à un autre. Le schéma de la table est exactement le même. J'ai besoin de déplacer des données partielles de la source, qui peuvent être ou ne pas être disponibles dans la table de destination. La solution que je pense est, utiliser bcp pour exporter des données dans un fichier texte (ou .dat) et ensuite prendre ce fichier à la destination car les deux ne sont pas accessibles en même temps (réseau différent), puis importer les données sur le destination. Il y a quelques conditions que je dois satisfaire:Copie en bloc d'un serveur à un autre

  1. Je dois exporter seulement une liste de données de la table, pas entière. Mon client va me donner des identifiants qui doivent être déplacés de la source à la destination. J'ai environ 3000 enregistrements dans la table principale, et même dans les tables enfant aussi. Ce que je m'attends à ce que seulement 300 enregistrements soient déplacés.
  2. Si l'enregistrement existe dans la destination, le client va lui demander d'ignorer ou d'écraser case par case. 90% du temps, nous devons ignorer les enregistrements sans écraser, mais consigner les enregistrements dans un fichier journal.

S'il vous plaît aidez-moi avec la meilleure approche. J'ai pensé à utiliser BCP avec l'option de requête pour filtrer les données, mais pendant l'importation, comment contourner l'insertion des enregistrements existants? Comment écraser, si nécessaire?

+0

Mis à jour ma réponse, encore une fois :) –

Répondre

1

Malheureusement BCPing dans une table est un accord tout ou rien, vous ne pouvez pas sélectionner des lignes pour mettre en.

Ce que je ferais est. . .

  1. Créer une table sur la base de données source , cela va stocker de l'ID des lignes que vous avez besoin de se déplacer. Vous pouvez maintenant BCP les lignes dont vous avez besoin .
  2. Sur la base de données de destination, créez une nouvelle table de travail en cours et BCP les lignes qui s'y trouvent.
  3. Une fois dedans, vous pouvez écrire un script qui décidera si une ligne WIP va ou non dans la table de destination .

Hope this helps.

tables Je ne veux pas dire des tables #temp

Mise à jour

par les travaux en cours (WIP), vous ne pouvez pas BCP dans une table temporaire (au moins je serais très sprprised si vous pouviez) .
Je veux dire une table que vous créez avec la même structure de la table de destination, bcp dans cela, script les lignes WIP à la table de destination puis déposez la table WIP.

Vous n'avez pas dit quel SGBDR vous utilisez, en supposant SQL Server, quelque chose comme le suivant (code non-testé). . .

-- following creates new table with identical schema to destination table 
select * into WIP_Destination from Destination 
where 1 = 0 

-- BCP in the rows 
BULK INSERT WIP_Destination from 'BcpFileName.dat' 

-- Insert new rows into Destination 
insert into Destination 
Select * from WIP_Destination 
where not id in (select id from Destination) 

-- Update existing rows in destination 

Update Destination 
set field1 = w.field1, 
    field2 = w.field2, 
    field3 = w.field3, 
    . . . 
from Destination d inner join WIP_Destination w on d.id = w.id 

Drop table WIP_Destination 

Mise à jour 2
OK, donc vous pouvez insérer dans des tables temporaires, je ne l'ai essayé (je ne l'ai pas eu le temps l'autre jour, désolé).Sur le problème des enregistrements maître/détail (et nous quittons maintenant le sujet de la question initiale, si j'étais vous j'ouvrirais une nouvelle question pour ce sujet, vous aurez plus de réponses que juste le mien)

Vous pouvez écrire un SP qui va parcourir les nouvelles lignes à ajouter.
Ainsi, vous parcourez les lignes de votre table temporaire (ces lignes ont l'ID d'origine de la base de données source), insérez cette ligne dans la table Destination, utilisez SCOPE_IDENTITY pour obtenir l'ID de la ligne nouvellement insérée. Maintenant vous avez l'ancien ID et le nouvel ID, vous pouvez créer une instruction d'insertion qui insérera l'instruction pour les lignes de détail comme. . .

insert into Destination_Detail 
select @newId, field1, field2 . . . from #temp_Destination_Detail 
where Id = @oldId 

Hope this helps [si elle a aidé vous êtes autorisé à upvote cette réponse, même si ce n'est pas la réponse que vous allez sélectionner :)]

Merci
BW

+0

Merci pour la réponse. Je pensais pareil. Créez une table dans la base de données source et chargez la liste des enregistrements à déplacer, utilisez la requête avec bcp. Pour l'importation, ce que je pensais être, créer une table #temp et importer toutes les données du fichier .dat en utilisant bcp et ensuite, utiliser une requête de #temp à la table principale si les enregistrements n'existent pas dans la destination. Est-ce que le tableau Work in Progress signifie tables templ? Mais, pas sûr, si cette approche fonctionne ou non. Si quelqu'un peut m'aider avec une certaine syntaxe, ce sera utile. merci –

+0

Merci pour la réponse. Un doute. Si je n'ai pas le privilège de créer de nouvelles tables dans le système de destination, je pense que cela ne fonctionnera pas. Donc ce que vous dites est, vous ne pouvez pas bcp à #temp? Une exigence supplémentaire avec ceci est, j'ai une table principale avec l'identité sur pour la clé primaire et j'ai des tables enfant. Lorsque j'insère un enregistrement dans la table principale à l'aide de BCP, comment puis-je utiliser l'ID nouvellement créé dans la table principale pour l'insérer dans les tables enfant associées? Sera-t-il possible? Je peux être en mesure de définir l'identité, mais cela fonctionnera-t-il? merci Joseph –