Commande d'insertion SqlBulkCopy

c# sql sqlbulkcopy

Question

Pour copier des données d'une base de données sur une autre sur un serveur différent avec le même schéma, j'ai l'intention d'utiliser la classe SqlBulkCopy de la bibliothèque C sharp. Si SqlBulkCopy conservera le même ordre que dans le datatable lors de l'insertion des enregistrements?

Exemple: id est la colonne d'identité.

Server1, db1

TableA
id   name
1    name10
2    name20
3    name30
4    name40

Server2, db1

TableA
    id   name
    1    name1
    2    name2
    3    name3
    4    name4
    ..........
    ..........
    5000 name22
    5001 name33
  • Step1: var dt = select * from server1.dbo.TableA order by id;
  • Étape 2: copie groupée SQL dans server2 bulkCopy.WriteToServer(dt);
  • var resultDt = select top 4 id from server2.dbo.TableA order by id desc. 3: var resultDt = select top 4 id from server2.dbo.TableA order by id desc. Puisque nous connaissons le nombre d'enregistrements que nous avons insérés, j'utilise "top 4".
  • Étape 4: resultDt.DefaultView.Sort = "id asc";

Question: Si id dans resultDt représentera-t-il id dans dt pour toutes les lignes? c'est à dire,.

5002 from server2 = 1 from server1
5003 from server2 = 2 from server1
5004 from server2 = 3 from server1
5005 from server2 = 4 from server1

Note: Juste à titre d'exemple, j'ai donné moins de disques. La table actuelle contient des milliers d'enregistrements.

Réponse acceptée

Il semble qu'il n'y ait aucune garantie de commande en vrac. J'ai donc ajouté une colonne d'identifiant temporaire à la table de destination. Le flux sera comme suit:

Step1: var dt = select *, id as tempId from server1.dbo.TableA order by id;
Step2: SQL bulk copy into server2 bulkCopy.WriteToServer(dt);
Step3: var resultDt = select top 4 id, tempId from server2.dbo.TableA order by id desc. Since we know the number of records we inserted I am using "top 4".

Maintenant, id sera le nouvel identifiant généré par server2 et tempId sera celui de server1. Problème résolu :)


Réponse populaire

Une autre solution est disponible dans le lien ci-dessous:

https://social.msdn.microsoft.com/Forums/en-US/ee3d90b0-d212-4bf0-8f2a-5dcb716896eb/sqlbulkcopy-insert-order?forum=adodotnetdataproviders

  • Créez une table de transfert (par exemple, tmp_tableA) avec la même structure de tableA sans identité.
  • Copiez en bloc les données dans tmp_tableA.
  • Maintenant, insérez dans la tableA de tmp_tableA.


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi