簡體   English   中英

從 Excel / CSV 批量插入 SQL 服務器

[英]Bulk insert to SQL Server from Excel / CSV

我需要從 Excel 或 CSV 文件批量插入 SQL 服務器數據。 數據接近 100k 行。 我正在使用 C#/.NET。 在 Microsoft 文檔中,我發現:

BULK INSERT Sales.Invoices
FROM '\\share\invoices\inv-2016-07-25.csv'
WITH (FORMAT = 'CSV'
  , FIRSTROW=2
  , FIELDQUOTE = '\'
  , FIELDTERMINATOR = ';'
  , ROWTERMINATOR = '0x0a');

批量插入 (Transact-SQL)

如果我有 Excel 文件,我可以將其轉換為 CSV 並使用它。 這很好用而且效率很高,但我的問題是我無法訪問 SQL 服務器上的文件系統。 有誰知道解決這個問題的最佳方法是什么,或者是否有更好的完全不同的方法?

我看到這個問題,比如客戶端出於某種原因想要將數據加載到其中一個數據庫表中。

  • 如果他們需要自動化這個過程,或者他們需要如此頻繁地執行此過程或需要一次執行多個文件,我會通過要求客戶端將 CVS 文件或 Excel 文件復制到服務器文件夾來完成該過程他們想導入數據庫。

之后,我將編寫一個文件夾來觀察 .NET 應用程序,該應用程序將讀取 CVS 或 Excel 文件並將數據導入數據庫表。 如果加載數據失敗,它應該將文件移動到帶有錯誤日志的“錯誤文件”文件夾。 如果成功,應用程序會將該文件移動到“已完成文件”。

這種方法的優點。

  • 多個用戶可以使用此功能將數據上傳到服務器。
  • 用戶機器不需要任何類型的安裝。
  • 對文件夾的訪問可以完全由 AD 管理。

壞處

  • 這是處理這種用例的一種舊方法。
  • 用戶需要手動檢查日志或服務器文件夾以了解文件的狀態。

技術參考

您可以試用SqlBulkCopy ,允許您使用DataTable將數據直接插入數據庫。

可以在此處找到更多信息: SqlBulkCopy.WriteToServerAsync

正如解釋的那樣,使用 SQLBulkCopy 似乎是一個非常好的解決方案

這里

在這里,我們有這樣做的建議:

var lines = System.IO.File.ReadAllLines(@"d:\data.txt");
if (lines.Count() == 0) return;
var columns = lines[0].Split(',');
var table = new DataTable();
foreach (var c in columns)
    table.Columns.Add(c);

for (int i = 1; i < lines.Count() - 1; i++)
    table.Rows.Add(lines[i].Split(','));

var connection = @"your connection string";
var sqlBulk = new SqlBulkCopy(connection);
sqlBulk.DestinationTableName = "Table1";
sqlBulk.WriteToServer(table);

這是非常有效的,通過使用此代碼,我可以在不到 5 秒的時間內插入 100.000 條記錄,這是完全可以接受的性能。 直接 SQL SQL 服務器本身的批量插入當然更快,並且幾乎可以立即插入數據,但是在我的情況下這是不可能的,我們在這里有一個不錯的選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM