将csv导入SQL Server的快速而简单的方法
本文关键字:简单 方法 导入 SQL Server csv | 更新日期: 2023-09-27 18:29:23
我们使用CSVReader
导入一个csv文件,然后使用SqlBulkCopy
将该数据插入SQL Server。这段代码适用于我们,非常简单,但想知道是否有一种更快的方法(我们的一些文件有100000行)也不会变得太复杂?
SqlConnection conn = new SqlConnection(connectionString);
conn.Open();
SqlTransaction transaction = conn.BeginTransaction();
try
{
using (TextReader reader = File.OpenText(sourceFileLocation))
{
CsvReader csv = new CsvReader(reader, true);
SqlBulkCopy copy = new SqlBulkCopy(conn, SqlBulkCopyOptions.KeepIdentity, transaction);
copy.DestinationTableName = reportType.ToString();
copy.WriteToServer(csv);
transaction.Commit();
}
}
catch (Exception ex)
{
transaction.Rollback();
success = false;
SendFileImportErrorEmail(Path.GetFileName(sourceFileLocation), ex.Message);
}
finally
{
conn.Close();
}
与其构建自己的工具来实现这一点,不如看看SQL Server导入和导出/SIS。您可以直接针对平面文件和SQL Server数据库。输出dtsx
包也可以从命令行运行,也可以作为作业通过SQL Server代理运行。
我之所以建议它,是因为该向导针对并行性进行了优化,并且在大型平面文件上运行得非常好。
您应该考虑使用基于用户定义表类型(UDTT)的表值参数(TVP)。此功能是在SQL Server 2008中引入的,允许您定义一个强类型结构,该结构可用于将数据流式传输到SQL Server中(如果操作得当)。与使用SqlBulkCopy
相比,这种方法的一个优点是,您可以对一个表执行比简单的INSERT
更多的操作;由于数据以表变量的形式到达,因此您可以执行任何想要的逻辑(validate/upsrt等)。您可以在单个存储过程中处理所有导入逻辑,如果需要先暂存任何数据,则可以轻松使用本地临时表。这使得隔离流程变得非常容易,这样您就可以同时运行多个实例,只要您有办法在逻辑上分离要导入的行。
不久前,我在S.O.上发布了关于这个主题的详细答案,包括示例代码和其他信息的链接:
如何在最短的时间内插入1000万条记录?
甚至还有一个链接到我的一个相关答案,显示了这个主题的另一个变体。我在某个地方有第三个答案,它显示了一种批量方法,如果你有数百万行,但你没有,但一旦我发现,我会在这里添加链接。