2011-05-14 209 views
1

我需要做的是創建一個SQL Server腳本,以便將CSV文件中的記錄插入到表中。我知道這可以使用「BULK Insert」輕鬆完成。從Csv文件插入記錄到數據庫表(SQL Server)

BULK 
INSERT TempTable 
FROM 'C:\Records.csv' 
WITH 
(
    FIELDTERMINATOR = ',', 
    ROWTERMINATOR = '\n' 
) 
GO 

不幸的是,CSV文件包含不一致的限定符(「)某些字段可能或創建時CSV文件(手動地)如下面的樣品可能不具有此限定符:

10001,LeBron Quitter,CompanyA 
10002,"Insane, Charlie",CompanyB 
10003,Donald Punk,"CompanyC,CA" 

如果我對上述CSV格式使用上述代碼,將會出現以下錯誤:
1.限定符將包含在表格中(例如:「瘋狂」)
2.由於逗號(,)是fieldterminator,因此第2條記錄將被視爲4個領域。

所以我不得不考慮別的事情,因爲我不想預處理CSV文件。歸結到這個解決方案 - 使用MICROSOFT.JET.OLEDB.4.0。

INSERT INTO MyRealTable 
SELECT * FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Text;Database=C:\Temp\;','SELECT * FROM [Test.csv]') 

注:

EXEC 
sp_configure 'show advanced options', 1 
Reconfigure 
EXEC 
sp_configure 'Ad Hoc Distributed Queries', 1 
Reconfigure 
EXEC 
sp_configure 'OLE Automation Procedures', 1; 
Reconfigure 
EXEC 
sp_configure 'Agent XPs', 1; 
Reconfigure 

問題:
1。是我的解決方案是正確的執行上面的代碼一定要具有訪問權/許可&執行以下之前?
2.是否還有其他更好的解決方案?
3.由於我使用MICROSOFT.JET.OLEDB.4解決方案,應該安裝/必備軟件?

我接受任何建議,批評,或任何東西,因爲我只是想了解更多...謝謝你提前非常非常開放...

+0

這是一次性插入或東西,會經常發生? – RThomas 2011-05-14 05:49:47

+0

只要數據庫管理員想要批量插入記錄,就會完成此操作。我不認爲你可以稱之爲「定期」......對於混亂......抱歉... – Vini 2011-05-14 05:54:44

回答

1

試圖獨自做到這一點在SQL Server可能是相當一個挑戰 - 我最喜歡做這個獨立的,獨立的控制檯應用程序或其他東西。

基本上,我會用優秀的FileHelpers 2.0 library來處理CSV導入 - 像魅力一樣工作,非常易於使用。您可以將任何固定寬度或分隔文件導入到DataTable中。

一旦你有了這些,你可以轉過頭來用你的應用程序中的SqlBulkCopy將它們批量加載到SQL Server中。

的代碼會是這個樣子:

// define your input record - what fields are there, how are the rows and 
// fields delimited - the flexibility and power of FileHelpers is amazing! 

[DelimitedRecord(",")] 
public class InputRecord 
{ 
    public int ID; 
    [FieldQuoted('"', QuoteMode.OptionalForBoth)] 
    public string PersonName; 
    [FieldQuoted('"', QuoteMode.OptionalForBoth)] 
    public string CompanyName; 
} 

// in your console app, grab a file, import it into memory using FileHelpers, 
// then convert it into a DataTable and use SqlBulkCopy to insert it into SQL Server 
static void Main(string[] args) 
{ 
    // grab file name to import from command-line arguments 
    string fileNameToImport = args[0]; 

    // instantiate FileHelpers engine 
    FileHelperEngine engine = new FileHelperEngine(typeof(InputRecord)); 

    // read the data from the file into a DataTable 
    DataTable records = engine.ReadFileAsDT(fileNameToImport); 

    // create your SqlBulkCopy object 
    SqlBulkCopy bc = new SqlBulkCopy("server=(local);database=TEST;Integrated Security=SSPI;"); 

    bc.DestinationTableName = "TempTable"; 

    // bulk copy the data into SQL Server 
    bc.WriteToServer(records); 
} 
+0

謝謝marc_s!但看看我的最後一個解決方案(注意:它只需要使用一個腳本來執行),你認爲這足夠了嗎? – Vini 2011-05-14 08:17:03

相關問題