从 Sqlite 读取大量数据到 SQL 服务器在预执行时失败

Reading Huge volume of data from Sqlite to SQL Server fails at pre-execute

我有一个巨大的 (26GB) sqlite 数据库,我想使用 SSIS 将其导入 SQL 服务器。

我已正确设置所有内容。一些数据流正在正常工作并正在导入数据。

数据流很简单。它们仅由来源和目的地组成。

但是当涉及到具有 8000 万行的 table 时,数据流失败并显示以下无用消息:

Code: 0xC0047062
Source: Data Flow Task Source 9 - nibrs_bias_motivation [55]
Description: System.Data.Odbc.OdbcException (0x80131937): ERROR [HY000] unknown error (7)

at System.Data.Odbc.OdbcConnection.HandleError(OdbcHandle hrHandle, RetCode retcode)
at System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader, Object[] methodArguments, SQL_API odbcApiMethod)
at System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader)
at System.Data.Odbc.OdbcCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Odbc.OdbcCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
at Microsoft.SqlServer.Dts.Pipeline.DataReaderSourceAdapter.PreExecute()
at Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostPreExecute(IDTSManagedComponentWrapper100 wrapper)

并且在此任务失败之前,内存使用率上升到 99%,然后任务失败。这让我认为这是一个内存问题。但是不知道怎么解决。

我尝试将所有数据流任务的 DelayValidation 设置为 true。没有改变。 我玩了缓冲区大小。没有。

我能做什么?

分步指南

由于读取大型数据集时会抛出错误,请尝试分块读取数据,实现方法如下:

  1. 声明 2 个 Int32 类型的变量(@[User::RowCount]@[User::IncrementValue]
  2. 添加执行select Count(*)命令的Execute SQL Task并将结果集存储到变量@[User::RowCount]

  1. 添加具有以下首选项的 For 循环:

  1. 在 for 循环容器内添加一个 Data flow task
  2. 在数据流任务中添加一个 ODBC SourceOLEDB Destination
  3. 在 ODBC Source select SQL Command 选项中编写一个 SELECT * FROM TABLE 查询 *(仅检索元数据`
  4. 映射源和目标之间的列
  5. 返回 Control flow 并点击 Data flow task 并按 F4 查看属性 window
  6. 在属性 window 中转到表达式并将以下表达式分配给 [ODBC Source].[SQLCommand] 属性:(有关更多信息,请参阅 How to pass SSIS variables in ODBC SQLCommand expression?)

    "SELECT * FROM MYTABLE ORDER BY ID_COLUMN
    LIMIT 500000
    OFFSET " + (DT_WSTR,50)@[User::IncrementValue]"
    

其中 MYTABLE 是源 table 名称,IDCOLUMN 是您的主键或标识列。

控制流截图

参考资料