【问题标题】:Load big text file in SQL Server [duplicate]在 SQL Server 中加载大文本文件 [重复]
【发布时间】:2019-11-21 09:24:45
【问题描述】:

我想加载一个非常大的文件 3GB 的文本(不是逗号分隔)只是一个文本,所以文本中的每一行都成为一个记录

我的表结构应该是这样的

加载表 ID bigint 身份 TLine varchar(max)

我尝试使用 SQL 任务导入数据,但总是收到此错误

  • 执行(错误)消息错误 0xc02020a1:数据流任务 1:数据转换失败。返回列“Column 0”的数据转换 状态值 4 和状态文本“文本被截断或一个或多个 目标代码页中的字符不匹配。”。(SQL Server 导入 和导出向导)

错误 0xc020902a:数据流任务 1:“源 - NOTEEVENTS_csv.Outputs[平面文件源输出].Columns[Column 0]" 由于发生截断而失败,并且截断行处置 在“源 - NOTEEVENTS_csv.Outputs [平面文件源 Output].Columns[Column 0]" 指定截断失败。A 在指定的指定对象上发生截断错误 零件。 (SQL Server 导入导出向导)

错误 0xc0202092:数据流任务 1:处理时出错 文件“E:\MyFile.txt” 数据行 1。(SQL Server 导入和导出向导)

错误 0xc0047038:数据流任务 1:SSIS 错误代码 DTS_E_PRIMEOUTPUTFAILED。 Source 上的 PrimeOutput 方法 - NOTEEVENTS_csv 返回错误代码 0xC0202092。返回的组件 当管道引擎调用 PrimeOutput() 时出现故障代码。这 失败代码的含义是由组件定义的,但是错误 是致命的并且管道停止执行。可能有错误 在此之前发布的消息,其中包含有关失败的更多信息。 (SQL Server 导入导出向导)

如何修复此错误并将每一行加载为 ID 显示行顺序的记录?

【问题讨论】:

    标签: sql-server flat-file


    【解决方案1】:

    VARCHAR(max) 列(行)的最大存储大小为 2Gb,as per the documentation:

    varchar [ ( n | max ) ] 可变大小的字符串数据。使用 n 定义 字符串大小(以字节为单位),可以是 1 到 8,000 之间的值,也可以使用 max 表示列约束大小最多存储 2^31-1 字节 (2 GB)。


    (出于演示目的,我使用了big.txt file from Peter Norvig's site)

    您可以运行 BULK INSERT 查询,而不是使用 SSMS 中的用户界面,如下所示:

    SELECT
        ROW_NUMBER() over (ORDER BY (SELECT NULL)) ROW_NR
        , *
    INTO MyTable
    FROM OPENROWSET
        (BULK N'C:\..\Desktop\big.txt', FORMATFILE=N'C:\..\Desktop\big_format_file.xml') tmp
    

    不过,在此之前您需要做一些事情:

    1. 创建一个Format File,以指定格式(就像您为平面文件导入指定行终止符、列终止符一样)。 (在我的答案底部生成此文件的简单解决方法)

      我选择创建 .XML 文件格式是因为它更易于阅读。这个文件的内容是:

    <?xml version="1.0"?>
    <BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <RECORD>
      <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="\n" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
     </RECORD>
     <ROW>
      <COLUMN SOURCE="1" NAME="txt" xsi:type="SQLVARYCHAR"/>
     </ROW>
    </BCPFORMAT>
    

    虽然这是一个示例文档,但请确保 TERMINATOR 选项设置了您希望作为行分隔符的正确终止符。

    1. 之后,您可以运行上面的查询将数据导入MyTable。

      从此时起,您可以使用 SELECT INTO 将信息保存到新表中,使用 INSERT 将新行添加到现有表中,甚至可以使用 UPDATE 将列更新到现有表中。

    就我而言,MyTable 的内容如下所示:


    创建格式文件的一个简单解决方法是在数据库中创建一个表,您期望输入数据具有的结构是:

    1. 使用结构/定义创建虚拟表(例如:big_bulk)

    创建表 big_bulk (txt varchar(max))

    1. 运行 BCP 命令以从该表中生成文件格式:

    bcp test.dbo.big_bulk 格式 nul -c -x -f .\Desktop\big_format_file.xml -t, -T

    上述 bcp 命令中的 -t 参数指定行分隔符。您可以将逗号(“,”)替换为“\t”或“\r”或其他Field and Row Terminators

    1. 编辑 XML 文件并确保设置正确的行终止符/分隔符。

    2. 在OPENROWSET() 查询中使用文件格式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-16
      • 2021-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多