首页 > 解决方案 > 自动将 CSV 文件导入 SQL Server

问题描述

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

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

有些列是文本,并用双引号分隔(“像在 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 中进行整个导入?这是混乱和耗时的。

标签: sql-servercsvbulkinsert

解决方案


好的,所以我发现很多人在这里和 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 末尾的引号。但重要的一点是逗号保留在列数据内容中。

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

埃里克


推荐阅读