将csv导入SQL Server的快速而简单的方法

时间:2016-01-08 01:05:42

标签: c# .net sql-server sqlbulkcopy

我们正在导入带有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();
        }

2 个答案:

答案 0 :(得分:3)

不要构建自己的工具来执行此操作,而是查看SQL Server Import and Export / SSIS。您可以直接定位平面文件和SQL Server数据库。输出dtsx包也可以从命令行运行,也可以通过SQL Server代理作为作业运行。

我之所以建议它是因为该向导针对并行性进行了优化,并且在大型平面文件上运行良好。

答案 1 :(得分:1)

您应该考虑使用表值参数(TVP),它基于用户定义的表类型(UDTT)。此功能是在SQL Server 2008中引入的,允许您定义一个强类型结构,可用于将数据流式传输到SQL Server(如果正确完成)。与使用SqlBulkCopy相比,这种方法的一个优点是,您可以在表格中执行多个简单INSERT;你可以做任何你想要的逻辑(验证/ upsert / etc),因为数据以表变量的形式到达。您可以在单个存储过程中处理所有导入逻辑,如果需要先暂存任何数据,则可以轻松使用本地临时表。这样就可以很容易地隔离进程,这样只要您有办法逻辑分离要导入的行,就可以同时运行多个实例。

我在S.O.上发表了关于这个主题的详细答案。前一段时间,包括示例代码和其他信息的链接:

How can I insert 10 million records in the shortest time possible?

甚至还有一个链接到我的相关答案,显示该主题的另一个变体。我有一个第三个答案显示批量方法,如果你有数百万行,你没有,但一旦我发现我将在这里添加链接。