从Csv文件插入记录到数据库表(SQL Server)

问题描述:

我需要做的是创建一个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

试图独自做到这一点在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