从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解决方案,应该安装/必备软件?
我接受任何建议,批评,或任何东西,因为我只是想了解更多...谢谢你提前非常非常开放...
试图独自做到这一点在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);
}
谢谢marc_s!但看看我的最后一个解决方案(注意:它只需要使用一个脚本来执行),你认为这足够了吗? – Vini 2011-05-14 08:17:03
这是一次性插入或东西,会经常发生? – RThomas 2011-05-14 05:49:47
只要数据库管理员想要批量插入记录,就会完成此操作。我不认为你可以称之为“定期”......对于混乱......抱歉... – Vini 2011-05-14 05:54:44