SSIS派生列DT_TEXT类型替换操作报错(Visual Studio 2008)
解决SSIS中DT_TEXT类型字段替换引号的问题
嘿,我之前也踩过这个坑!SSIS的REPLACE函数确实不支持DT_TEXT这种大文本数据类型,得先做类型转换才能处理,给你两种可行的方案:
方案一:用表达式转换类型后替换(适合文本长度≤8000)
因为REPLACE只支持DT_STR(ANSI字符串)或DT_WSTR(Unicode字符串)类型,所以我们先把DT_TEXT转成这两种类型之一,替换完成后再转回DT_TEXT:
针对ANSI编码(1252)的表达式:
(DT_TEXT,1252)REPLACE(CAST([Summary_N] AS DT_STR, 4000, 1252), "\"", "'")
- 这里
CAST([Summary_N] AS DT_STR, 4000, 1252)把DT_TEXT转成最大长度4000的ANSI字符串 - 替换完成后用
(DT_TEXT,1252)转回原类型
如果你的文本长度超过4000,可以换成DT_WSTR(最大支持8000长度):
(DT_TEXT,1252)REPLACE(CAST([Summary_N] AS DT_WSTR, 8000), "\"", "'")
方案二:用脚本组件处理(适合超长文本)
如果你的DT_TEXT字段内容超过8000字符,表达式就不够用了,这时候用脚本组件更靠谱:
- 在数据流任务里添加脚本组件,选择“转换”类型
- 把
Summary_N字段添加到输入列 - 在脚本编辑器里选择C#或VB作为脚本语言,然后在
Input0_ProcessInputRow方法里写逻辑:
C#示例代码:
public override void Input0_ProcessInputRow(Input0Buffer Row) { // 读取DT_TEXT字段的字节数据,转成字符串 byte[] textBytes = Row.Summary_N.GetBlobData(0, (int)Row.Summary_N.Length); string textContent = System.Text.Encoding.GetEncoding(1252).GetString(textBytes); // 替换双引号为单引号 textContent = textContent.Replace("\"", "'"); // 把处理后的字符串转回字节数组,写入DT_TEXT字段 byte[] processedBytes = System.Text.Encoding.GetEncoding(1252).GetBytes(textContent); Row.Summary_N = new Microsoft.SqlServer.Dts.Pipeline.BlobColumn(); Row.Summary_N.AddBlobData(processedBytes); }
这样就能完美解决REPLACE不支持DT_TEXT的问题啦!
内容的提问来源于stack exchange,提问作者MiguelH
相关产品推荐
相关产品推荐

