如何从SQL Server 2016中存储为Image类型的RTF内容提取纯文本
可行实现方案
方案1:SQL Server 原生T-SQL实现
思路为先通过类型转换拿到完整RTF字符串,再通过自定义标量函数剥离所有RTF控制标记,提取纯文本,无需额外组件,可直接在数据库层完成。
- 首先创建RTF文本提取函数:
CREATE FUNCTION dbo.ExtractTextFromRTF(@RTF VARCHAR(MAX)) RETURNS VARCHAR(MAX) AS BEGIN DECLARE @Pos INT, @Start INT, @End INT -- 剥离最外层大括号 SET @Start = CHARINDEX('{', @RTF) + 1 SET @End = CHARINDEX('}', @RTF, @Start) SET @RTF = SUBSTRING(@RTF, @Start, @End - @Start) -- 移除所有嵌套的控制块(如字体表、样式表等) WHILE CHARINDEX('{', @RTF) > 0 BEGIN SET @Start = CHARINDEX('{', @RTF) SET @End = CHARINDEX('}', @RTF, @Start) IF @End = 0 BREAK SET @RTF = STUFF(@RTF, @Start, @End - @Start + 1, '') END -- 移除所有\开头的RTF控制字 SET @Pos = CHARINDEX('\', @RTF) WHILE @Pos > 0 BEGIN SET @End = @Pos + 1 WHILE @End <= LEN(@RTF) AND SUBSTRING(@RTF, @End, 1) NOT IN (' ', '\', '{', '}') SET @End = @End + 1 SET @RTF = STUFF(@RTF, @Pos, @End - @Pos, '') SET @Pos = CHARINDEX('\', @RTF) END -- 清理多余空白字符 RETURN LTRIM(RTRIM(REPLACE(REPLACE(@RTF, CHAR(13), ''), CHAR(10), ''))) END
若需要提取中文等非ASCII内容,将函数中所有
VARCHAR替换为NVARCHAR即可。
- 调用函数查询结果:
SELECT dbo.ExtractTextFromRTF(CAST(CAST(NoteText AS varbinary(max)) AS varchar(max))) AS PureNoteText FROM Notes
方案2:SSIS 脚本组件实现(更稳定,推荐复杂RTF场景)
该方案调用.NET原生的RTF解析能力,无需手动匹配控制标记,兼容性更强,可解决导出列组件乱码问题。
操作步骤:
- 在数据流任务中配置数据源,读取
Notes表的NoteText字段 - 添加「脚本转换」组件,转换类型选择「转换」,输入列勾选
NoteText,新增输出列PureText,类型选择DT_WSTR(MAX) - 编辑脚本,添加
System.Windows.Forms引用,在ProcessInputRow方法中写入如下逻辑:
using System.Windows.Forms; public override void Input0_ProcessInputRow(Input0Buffer Row) { if (!Row.NoteText_IsNull) { // 二进制转RTF字符串 byte[] rtfBytes = Row.NoteText.GetBlobData(0, (int)Row.NoteText.Length); string rtfStr = System.Text.Encoding.Default.GetString(rtfBytes); // 解析RTF提取纯文本 using (RichTextBox rtb = new RichTextBox()) { rtb.Rtf = rtfStr; Row.PureText = rtb.Text.Trim(); } } else { Row.PureText_IsNull = true; } }
- 后续可直接将输出的
PureText写入目标表或文件即可。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

