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

时间:2011-05-14 05:32:14

标签: sql-server csv insert

我需要做的是创建一个SQL Server脚本,将CSV文件中的记录插入表中。我知道这可以通过“BULK Insert”轻松完成。

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.由于逗号(,)是字段终止符,因此第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解决方案,应该安装什么/先决条件?

我对任何建议,批评或任何事情都持开放态度,因为我只是想了解更多......非常感谢你提前...

1 个答案:

答案 0 :(得分: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);
}