我有一个巨大的 (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 读取数据,可以按照以下步骤实现:
- 声明 2 个
Int32
类型的变量(@[User::RowCount]
和@[User::IncrementValue]
) - 添加一个
执行 SQL 任务
,该任务执行select Count(*)
命令并将结果集存储到变量@[User::RowCount]
- 添加具有以下首选项的 For 循环:
- 在 for 循环容器内添加一个
数据流任务
- 在数据流任务内添加
ODBC Source
和OLEDB 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
是您的主键或标识列。
控制流截图
引用文献
关于sql-server - 从 Sqlite 读取大量数据到 SQL Server 在预执行时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54168322/