sql-server - 从 Sqlite 读取大量数据到 SQL Server 在预执行时失败

标签 sql-server sqlite ssis etl sqlite-odbc

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

我已经正确设置了所有内容。部分数据流工作正常并正在导入数据。

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

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

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。没有改变。 我玩弄了缓冲区大小。没什么。

我能做什么?

最佳答案

分步指南

由于读取大数据集时会抛出错误,请尝试按 block 读取数据,可以按照以下步骤实现:

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

enter image description here

enter image description here

  • 添加具有以下首选项的 For 循环:
  • enter image description here

  • 在 for 循环容器内添加一个数据流任务
  • 在数据流任务内添加 ODBC SourceOLEDB Destination
  • 在 ODBC 源中选择 SQL Command 选项并编写 SELECT * FROM TABLE 查询*(仅检索元数据`
  • 映射源和目标之间的列
  • 返回控制流并单击数据流任务并按F4查看属性窗口
  • 在属性窗口中,转到表达式并将以下表达式分配给 [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 是源表名称,IDCOLUMN 是您的主键或标识列。

    控制流截图

    enter image description here

    引用文献

    关于sql-server - 从 Sqlite 读取大量数据到 SQL Server 在预执行时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54168322/

    相关文章:

    sql-server - 如何使用bcp将sql数据导出到csv

    python - sqlite3 是否压缩数据?

    android - Android 中 Room 根据主键自动排序

    database - 组件 OLE DB 源没有输入

    sql - 从多个数据源导入 SSIS

    sql - LIKE子句在SQL Server中不起作用

    sql - 使用 SQL 时间

    sql-server - 从损坏的 SQL Server 数据库中恢复事务日志

    sqlite - 如何从SQLite中的表中选择最新的100个不同条目?

    sql-server - SSIS 事件目录集成