Comment fonctionne SqlBulkCopy

.net sqlbulkcopy sql-server

Question

Je connais bien la classe C # SqlBulkCopy dans laquelle vous pouvez appeler la méthode 'WriteToServer' via un DataTable.

Ma question est quel mécanisme sous-jacent dans SQL Server est utilisé pour insérer en bloc ces données?

La raison pour laquelle je pose cette question est que l'insertion en bloc référencée dans le fichier d'aide Insertion en bloc MSDN T-SQL nécessite un fichier de données à importer. Est-ce que SqlBulkCopy crée un fichier de données?

J'aimerais comprendre ce que je veux savoir si je peux utiliser la fonctionnalité d'insertion en bloc dans SQL.

Si j'écris une instruction SQL préparant toutes les lignes à insérer dans une table particulière (des milliers de lignes), puis-je les insérer en bloc dans la table de destination? Quelque chose comme ça, c'est comme ça que je le fais maintenant,

INSERT INTO sync_filters (table_name, device_id, road_id, contract_id)
    SELECT * FROM dbo.sync_contract_filters (@device_id)

Et dbo.sync_contract_filters est une fonction permettant de générer toutes les lignes à insérer. Cela peut-il être inséré en vrac?

Réponse acceptée

SqlBulkCopy ne crée pas de fichier de données. Il transmet la table de données directement de l'objet .Net DataTable au serveur en utilisant le protocole de communication disponible (Named Pipes, TCP / IP, etc.) et insère les données en masse dans la table de destination en utilisant la même technique que BCP. .


Réponse populaire

SqlBulkCopy peut utiliser un datatable, IDataReader ou DataRow [] comme source de données. Jetez un coup d'œil aux méthodes WriteToServer de la classe. J'ai trouvé que c'était un mécanisme très utile pour obtenir des données dans SQL Server. Je l'ai déjà utilisé avec CSVReader auparavant. Le lien précédent vous donne une idée de son fonctionnement avec une classe qui implémente IDataReader.

Vous devrez peut-être jouer avec les tailles de lot pour vous assurer d'obtenir les performances que vous attendez.

Le Guide de performances de chargement de données sur MSDN est une ressource très utile si vous souhaitez obtenir les meilleures performances possibles lors de la rédaction rapide de grandes quantités de données. Il se concentre plus sur des éléments tels que BCP et BULK INSERT, mais aborde SQLBulkCopy et fournit également beaucoup de matière à réflexion (peut-être un peu trop, mais c'est une référence utile du moins dans tous les cas).



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