【问题标题】:Automate the Import of CSV file into SQL Server自动将 CSV 文件导入 SQL Server
【发布时间】:2019-09-24 07:09:54
【问题描述】:

我正在尝试将多个不同的 csv 文件导入 SQL Server 2008R2 数据库

文件中的数据以逗号分隔。 我对文件格式没有发言权。

有些列是文本,并用双引号分隔(“like in excel”)。 这些列包含的文本中可能有额外的逗号(“但是,它让我发疯”)..

我尝试使用批量插入将文本文件加载到多个 SQL 表中。但是,文本列中嵌入的逗号会导致它崩溃。 SQL Server 2017 包含设置FORMAT =CSV and FIELDQUOTE = '"' 的选项,但我坚持使用 SQL Server 2008R2。

我可以使用 DTS/SSIS,但它将 VS 版本链接到 SQL 版本。因此,如果我在 VS2012 或 VS2010 中编写 SSIS,它可能不适用于我们的 SQL Server 2008R2。而且我认为我们没有任何 VS2008。

那么导入这些 CSV 文件的下一个最佳方法是什么。

批量上传是将六个不同的 csv 文件上传到不同表中的最简洁的方法。

我是否预处理 csv 文件并用管道替换逗号。如果是这样,我怎么知道要替换哪些逗号(正则表达式?)? 还是我在 .Net 中进行整个导入?这既麻烦又耗时。

【问题讨论】:

  • 在不同版本的 VS 中创建的 SSIS 包很少不会在不同版本中打开,但是较新版本的 Visual Studio 应该可以与较旧的数据库版本一起使用。这应该不是问题。我建议至少尝试在 VS2012 中制作一个测试包连接到数据库并在文件中写入一些示例数据以进行验证。不会占用您太多时间。
  • IMO 是使用 SQLCLR 创建自定义解决方案的最佳方式。
  • 如果您习惯使用 C#,那么我会考虑编写一个程序来读取 csv 文件并使用 SQLBulkCopy 插入数据库:johnnycode.com/2013/08/19/…
  • SQL Server 在处理符合 RFC4180 的 CSV 文件方面非常糟糕。例如,Microsoft 花了 10 年时间才让 CSV 导出在 SSRS 中正常工作。我与 DarkoMartinovic 和 SteveFord 在一起 - 使用 SQL CLR 或使用 SQLBulkCopy 的 C# 客户端程序。

标签: sql-server csv bulkinsert


【解决方案1】:

好的,所以我发现很多人在这里和 StackExchange 上提出这个问题,并被告知无法完成,您需要使用 SSIS。

您只需要一个 SQL 格式文件。尽管有一些关于如何使用格式文件的链接,但我只找到了一个解释它如何正常工作的链接,其中包括带有逗号的文本字段。

这是在 sql 脚本中使用的语法

        BULK INSERT raw.routes FROM N'C:\WhereMyTextFileis\Import.txt'  
        WITH ( 
            FORMATFILE = N'C:\WhereMyFormatFileIS\MyFormat.fmt'
            ,FIRSTROW = 2

        )

这是我的格式文件的内容

10.0
8
1       SQLCHAR             0       50      ","     	1     RouteID            ""
2       SQLCHAR             0       50      ",\""     	2     RouteShortName     Latin1_General_CI_AS
3       SQLCHAR             0       100      "\","     	3     RouteLongName      Latin1_General_CI_AS
4       SQLCHAR             0       200      ","     	4     RouteDescription	""
5       SQLCHAR             0       50      ","     	5     RouteType         ""
6       SQLCHAR             0       2000      ","   	6     RouteURL          ""
7       SQLCHAR             0       100      ","   		7     RouteColour       ""
8       SQLCHAR             0       100      "\r\n"   	8     RouteTextColour   ""

奇怪的 ","\"" 是删除引用文本列 RouteShortName 开头的双引号,而 "\"," 删除引用文本列 RouteShortName 末尾的引号。但重要的是关键是逗号保留在列数据内容中。

希望这对其他人也有帮助。

埃里克

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-20
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    相关资源
    最近更新 更多