2012-08-29 10 views
9

Ich bin vertraut mit der C# SqlBulkCopy-Klasse, wo Sie die 'WriteToServer' Methode durch eine DataTable übergeben können.Wie funktioniert SqlBulkCopy

Meine Frage ist, welche zugrundeliegenden Mechanismus in SQL Server verwendet wird, um diese Daten in großen Mengen einzufügen?

Der Grund, warum ich frage, ist, dass die Masseneinfügung, auf die in der Bulk Insert MSDN T-SQL-Hilfedatei verwiesen wird, eine zu importierende Datendatei erfordert. Erstellt SqlBulkCopy eine Datendatei?

Ich würde gerne diese Dinge verstehen, um herauszufinden, ob ich die Bulk-Insert-Funktionalität in SQL verwenden kann.

Wenn ich eine SQL-Anweisung schreibe, die alle Zeilen vorbereitet, um sie in eine bestimmte Tabelle einzufügen (Tausende von Zeilen), kann ich sie in die Zieltabelle einfügen? So etwas ist, wie ich es jetzt tue,

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

Und der dbo.sync_contract_filters ist eine Funktion, um alle Zeilen zu erzeugen, einzufügen. Kann das Bulk eingefügt werden?

Antwort

8

SqlBulkCopy erstellt keine Datendatei. Es streamt die Datentabelle direkt vom .Net DataTable-Objekt zum Server unter Verwendung des verfügbaren Kommunikationsprotokolls (Named Pipes, TCP/IP usw.) und fügt die Daten in die Zieltabelle in großen Mengen ein, wobei dieselbe von BCP verwendete Technik verwendet wird .

+0

So etwas, was mich interessiert, ist zusätzlich kann ich eine SQL-Anweisung erstellen, die die Zeilen erstellen, die ich für eine bestimmte Tabelle benötige, und dann sie in großen Mengen einfügen (das verwendet SQL vollständig). Kann BCP dies zum Beispiel tun? Ich hatte den Eindruck, dass bcp auch Tabellen verwendet. – peter

2

SqlBulkCopy kann eine Datentabelle, IDataReader oder DataRow [] als Datenquelle verwenden. Sehen Sie sich die WriteToServer-Methoden der Klasse an. Ich habe festgestellt, dass es ein ziemlich nützlicher Mechanismus zum Abrufen von Daten in SQL Server ist. Ich habe dies zuvor in Verbindung mit CSVReader verwendet. Der vorherige Link gibt Ihnen eine Vorstellung davon, wie er mit einer Klasse funktioniert, die IDataReader implementiert.

Möglicherweise müssen Sie play around with the batch sizes, um sicherzustellen, dass Sie die Leistung erhalten, die Sie erwarten.

The Data Loading Performance Guide auf MSDN ist eine ziemlich nützliche Ressource, wenn Sie die beste Leistung aus dem Schreiben großer Datenmengen schnell suchen. Es konzentriert sich mehr auf Dinge wie BCP und BULK INSERT, aber berührt SQLBulkCopy und bietet auch eine Menge Denkanstöße (vielleicht ein bisschen zu viel, aber es ist zumindest eine nützliche Referenz).

Verwandte Themen