我需要做的是创建一个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解决方案,应该安装什么/先决条件?
我对任何建议,批评或任何事情都持开放态度,因为我只是想了解更多......非常感谢你提前...
答案 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);
}