sql-server - SSIS 使用 UTF-8 将 OLEDB 源导出到平面文件
问题描述
我正在尝试将 OLEDB 源(从存储过程)导出到 UTF-8 平面文件,但出现以下错误:
[平面文件目标 [2]]
错误:数据转换失败。列“名称”的数据转换返回状态值 4 和状态文本“文本被截断或一个或多个字符在目标代码页中不匹配。”。
name 列在存储过程中定义为nvarchar(30)
.
在 OLEDB 源的高级编辑器中,我将 AlwaysUseDefaultCodePage 设置为 true,并将 DefaultCodePage 设置为 65001。
在外部列和输入列的平面文件的高级编辑器中,数据类型是长度为 30 的 Unicode 字符串 [DT-WSTR]。
平面文件的连接管理器未选中 Unicode 复选框,代码页为:65001 (UTF-8)。
我现在很难过,任何帮助将不胜感激。
谢谢,大卫
编辑:
我将错误和截断重定向添加到平面文件目标,但没有发送到文件。
此外,当我在 OLE DB 源上有一个数据查看器时,它会显示所有记录。
目的地的数据查看器还显示所有记录。两个查看器中的名称长度均为 30 个字符(来自 Excel)。
解决方案
我放弃了让数据流正常工作,而是编写了一个 C# 脚本任务。
通过选中平面文件连接管理器中的 Unicode 复选框,我更改了数据流的输出以生成 Unicode 文件。
然后,我让新的 C# 脚本一次读取 Unicode 文件一行,并使用 Encoding.UTF8 在行变量末尾添加一个新行字符将该行输出到另一个平面文件。
创建新文件后,我删除输入文件并将新文件重命名为与原始输入文件相同的路径和名称。这也在 C# 脚本中完成。
推荐阅读
- ios - 我们的代码样式在模拟器上与通过 testflight 部署在应用程序上看起来不同。需要帮助调试
- javascript - Twilio 新手,难以将数据从数据库传递到 Twilio,因此它使用 Azure 上的无服务器功能发送带有信息的文本消息
- android - MotionLayout 进度从 0 跳转到 1 无需中间步骤
- c - 定义的幻数后跟CRC有什么用
- python - 通过 BeautifulSoup 进行网页抓取
- node.js - npm 审核 EINVALIDTAGNAME
- angular - 在 Angular 模板中渲染 Observable 对象属性
- r - 如何在R中找到函数的上限和下限
- jms - 具有多个代理的 JMSTemplate。目的地解析异常
- javascript - 自动在一行 CSS 中淡入淡出同一张图片