【问题标题】:Bulk insert with text qualifier in SQL Server在 SQL Server 中使用文本限定符批量插入
【发布时间】:2014-11-01 19:09:31
【问题描述】:

我正在尝试 bulk insert CSV 文件中的表测试中的几条记录,

 CREATE TABLE Level2_import 
 (wkt varchar(max),
 area VARCHAR(40),
 ) 


BULK
 INSERT level2_import 
 FROM 'D:\test.csv'
 WITH
 (
 FIRSTROW = 2,
 FIELDTERMINATOR = ',',
 ROWTERMINATOR = '\n'
 )

批量插入代码应该去掉第一行并将数据插入到表中。它摆脱了第一行,但在分隔符部分感到困惑。第一列是 wkt ,列 value 是双引号,并且 value 中有逗号。

所以我想我的问题是,是否有办法告诉BULK INSERT 双引号部分是一列,而不管其中的逗号如何?

CSV 文件如下所示,

 "MULTIPOLYGON (((60851.286135090661 510590.66974495345,60696.086128673756 510580.56976811233,60614.7860844061 510579.36978015327,60551.486015895614)))", 123123.22

【问题讨论】:

    标签: sql-server bulkinsert spatial


    【解决方案1】:

    您需要使用“格式文件”来实现批量插入的文本限定符。本质上,您需要告诉批量插入每个字段中可能存在不同的分隔符。

    创建一个名为“level_2.fmt”的文本文件并保存。

    11.0
    2
    1   SQLCHAR   0  8000   "\","      1     wkt         SQL_Latin1_General_CP1_CI_AS
    2   SQLCHAR   0  40   "\r\n"      2     area         SQL_Latin1_General_CP1_CI_AS
    

    第一行,“11.0”是指您的 SQL 版本。第二行显示您的表 [level2_import] 有两列。之后的每一行将描述一列,并遵循以下格式:

    [源列号][数据类型][最小大小][最大大小][分隔符模式][目标列号][目标列名称][数据库区分大小写]

    创建该文件后,您可以使用以下批量插入语句读入数据:

    BULK INSERT level2_import
    FROM 'D:\test.csv'
    WITH 
    (
      FIRSTROW = 2,
      FORMATFILE='D:\level_2.fmt'
    );
    

    有关格式文件的详细说明,请参阅此blog

    【讨论】:

    • 比我之前的尝试更简洁和相关的答案。
    • 非常感谢您的帮助。
    • 你知道我为什么会收到这个错误吗? Cannot bulk load. The file "C:\mig\level_2.fmt" does not exist.我已经按照建议的内容创建了文件,但没有运气
    • 我的猜测是您将文件放在 SQL Server 无法访问的位置。当文件在我的本地机器上时,我得到了这个,我暂时忘记了 SQL Server 正在远程运行并映射到不同的驱动器。尝试将文件放在与 csv 文件相同的文件夹中,这样您至少可以测试功能。如果这有效,您可以将文件移回您想要的位置,并尝试确保它是从 SQL Server 的角度来看的有效位置。希望对您有所帮助。
    • 如果列 SOMETIMES 有引号,这会起作用吗?
    【解决方案2】:

    尝试将 .fmt 删除到文件中并改用 .txt,这对我有用

    【讨论】:

    • 能否请您详细说明您的答案,添加更多关于您提供的解决方案的描述?
    【解决方案3】:

    SQL Server 2017 终于增加了对文本限定符和 RFC 4180 中定义的CSV format 的支持。写起来应该够了:

    BULK INSERT level2_import 
    FROM 'D:\test.csv'
    WITH ( FORMAT = 'CSV', ROWTERMINATOR = '\n', FIRSTROW = 2 )
    

    【讨论】:

    • The docs say Azure SQL 确实支持 CSV : Beginning with SQL Server 2017 (14.x) CTP 1.1, BULK INSERT supports the CSV format, as does Azure SQL Database.。您的评论描述了旧版本所必需的 其他 解决方案之一:0x0a\n 的十六进制,char 用于非 Unicode 文件。
    【解决方案4】:

    我在处理 dns 包含逗号的 LDAP 数据时遇到了这个问题,其他包含 dns 的字段也是如此。尝试将您的字段终止符更改为另一个未使用的字符,例如管道 |或分号;。在数据和文件定义中执行此操作。

    所以代码应该是:

     CREATE TABLE Level2_import 
     (wkt varchar(max),
     area VARCHAR(40),
     ) 
    
    
    BULK
     INSERT level2_import 
     FROM 'D:\test.csv'
     WITH
     (
     FIRSTROW = 2,
     FIELDTERMINATOR = ';',
     ROWTERMINATOR = '\n'
     )
    

    和您的 CSV:

    "MULTIPOLYGON (((60851.286135090661 510590.66974495345,60696.086128673756 510580.56976811233,60614.7860844061 510579.36978015327,60551.486015895614)))"; 123123.22
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-13
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      相关资源
      最近更新 更多