从FileMaker导入数据到SQL Server的SSIS包数据类型错误求助
我正在创建SSIS包,将FileMaker 19.2.2的数据导入SQL Server 2019。已配置32位ODBC连接到布局,可在SSIS源编辑器中访问源系统并查看样本数据,无异常。我已将ODBC源映射到OLE DB SQL Server目标,并添加了数据转换步骤,但仅能加载四个测试列中的一个,持续遇到如下数据类型错误:
[OLE DB Destination [436]] 错误:为"NameFirst"列设置绑定时出错。绑定状态为"DT_NTEXT"。数据流列类型为"DBBINDSTATUS_UNSUPPORTEDCONVERSION"。从OLE DB类型"DBTYPE_IUNKNOWN"转换为目标列类型"DBTYPE_WVARCHAR"可能不受此提供程序支持。
[OLE DB Destination [436]] 错误:为"NameLast"列设置绑定时出错。绑定状态为"DT_NTEXT"。
[OLE DB Destination [436]] 错误:SSIS错误代码DTS_E_OLEDBERROR。发生OLE DB错误。错误代码:0x80004005。
存在可用的OLE DB记录。源:"Microsoft SQL Server Native Client 11.0" Hresult: 0x80004005 描述:"Invalid character value for cast specification"。
存在可用的OLE DB记录。源:"Microsoft SQL Server Native Client 11.0" Hresult: 0x80004005 描述:"Invalid date format"。
待加载的源元数据:
| Name | Data Type | Precision | Scale | Length | Code Page | Source Component |
|---|---|---|---|---|---|---|
| Created | DT_DBTIMESTAMP | 0 | 0 | 0 | 0 | ODBC Source |
| KeyEmployee | DT_TEXT | 0 | 0 | 0 | 1252 | ODBC Source |
| Modified | DT_DBTIMESTAMP | 0 | 0 | 0 | 0 | ODBC Source |
| NameFirst | DT_TEXT | 0 | 0 | 0 | 1252 | ODBC Source |
| NameLast | DT_TEXT | 0 | 0 | 0 | 1252 | ODBC Source |
| EmployeeID | DT_TEXT | 0 | 0 | 0 | 1252 | ODBC Source |
| EmploymentDate | DT_DBDATE | 0 | 0 | 0 | 0 | ODBC Source |
请问是否有人成功创建过从FileMaker拉取数据的SSIS包?希望能得到帮助。
1. 修复文本列类型转换问题
FileMaker ODBC驱动返回的DT_TEXT类型无法直接映射到SQL Server的VARCHAR/NVARCHAR,需通过Data Conversion组件显式转换:
- 拖拽Data Conversion组件到数据流,连接ODBC Source到该组件
- 选择所有
DT_TEXT类型列(KeyEmployee、NameFirst、NameLast、EmployeeID),将其转换为DT_STR(对应SQL VARCHAR,代码页选1252)或DT_WSTR(对应SQL NVARCHAR,支持Unicode) - 将转换后的列而非原始列映射到OLE DB Destination的对应字段
2. 解决日期格式错误
错误提示的"Invalid date format"通常是因为FileMaker的日期格式与SQL Server解析规则不匹配,或存在无效日期值:
- 显式转换日期:先用Data Conversion将
DT_DBTIMESTAMP/DT_DBDATE转为DT_WSTR(长度设为20足够),再用Derived Column组件通过表达式(DT_DBTIMESTAMP)[转换后的日期字符串]强制转换为SSIS日期类型,之后再映射到目标列 - 过滤无效数据:添加Conditional Split组件,用
ISDATE([EmploymentDate]) == True等条件过滤掉格式错误的日期行,或者用NULL(DT_DBDATE)替换无效值 - 检查FileMaker数据:确认FileMaker布局中的日期字段是否包含空值、非标准格式(如带文字描述的日期),必要时在FileMaker端先清理数据
3. 32位环境适配
由于使用32位ODBC驱动,需确保SSIS包运行环境一致:
- 在Visual Studio中,右键项目 -> 属性 -> 调试 -> 将
Run64BitRuntime设为False - 部署到SQL Server后,需用32位DTEXEC执行包,或者在SQL Server Agent作业中选择"使用32位运行时"选项
4. 替代优化方案
如果上述方法仍有问题,可尝试:
- 使用FileMaker官方提供的OLE DB驱动(若对应版本可用),其数据类型映射通常比ODBC更精准,减少转换报错概率
- 先通过FileMaker导出数据为CSV/Excel,再用SSIS导入,但这种方式适合小批量数据,实时性差
内容的提问来源于stack exchange,提问作者dbaDoug

