SSIS 2019:如何将nvarchar(max)列输出至UTF-8格式CSV平面文件
解决SSIS导出SQL Server nvarchar(max)到UTF-8 CSV的长度限制问题
针对SSIS里DT_WSTR(4000字符)、DT_STR(8000字符)无法承载nvarchar(max)大字段的问题,有两种可靠解决办法:
方案一:用脚本组件自定义导出
在数据流任务里添加脚本组件(作为目标),对接数据源输出,通过代码直接处理大字段:
- 编辑脚本组件,在
Input0_ProcessInputRow方法中编写逻辑,读取nvarchar(max)对应的Blob数据(SSIS默认将nvarchar(max)映射为DT_NTEXT类型,属于Blob范畴) - 参考C#代码示例:
using System.IO; using System.Text; public override void Input0_ProcessInputRow(Input0Buffer Row) { // 定义UTF-8编码(false表示不带BOM,按需调整) Encoding utf8 = new UTF8Encoding(false); // 读取大字段的Blob数据 byte[] blobData = Row.YourMaxColumn.GetBlobData(0, (int)Row.YourMaxColumn.Length); string content = utf8.GetString(blobData); // 写入CSV,注意处理格式转义(比如引号、逗号) using (StreamWriter sw = File.AppendText(@"D:\Output\result.csv")) { string escapedContent = content.Replace("\"", "\"\""); sw.WriteLine($"\"{escapedContent}\""); } }
- 注意:需自行处理CSV格式规范,比如字段含特殊字符时的转义逻辑,避免输出文件格式错误
方案二:调整平面文件连接管理器配置
无需写代码,直接通过配置解决:
- 确认数据源中的nvarchar(max)列被映射为DT_NTEXT类型(SSIS默认会自动识别,不要手动改成DT_WSTR/DT_STR)
- 配置平面文件连接管理器:
- 代码页选择65001(UTF-8)
- 切换到「高级」选项卡,将对应列的数据类型设为DT_NTEXT,无需手动填写长度(SSIS会自动处理大字段)
- 该方法适合简单场景,只要类型映射正确,就能导出完整的大字段内容
核心提醒
绝对不要将DT_NTEXT转换为DT_WSTR或DT_STR,这两种类型的长度限制是硬规则,无法突破;另外导出UTF-8时,按需选择是否带BOM——给系统读取一般用无BOM,给Excel读取可能需要带BOM(平面文件管理器或脚本中均可调整)
内容的提问来源于stack exchange,提问作者Roger Clerkwell
相关产品推荐
相关产品推荐

