将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();
        }

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

与其构建自己的工具来实现这一点,不如看看SQL Server导入和导出/SIS。您可以直接针对平面文件和SQL Server数据库。输出dtsx包也可以从命令行运行,也可以作为作业通过SQL Server代理运行。

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

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

不久前,我在S.O.上发布了关于这个主题的详细答案,包括示例代码和其他信息的链接:

如何在最短的时间内插入1000万条记录?

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