You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从SQL Server 2016中存储为Image类型的RTF内容提取纯文本

可行实现方案

方案1:SQL Server 原生T-SQL实现

思路为先通过类型转换拿到完整RTF字符串,再通过自定义标量函数剥离所有RTF控制标记,提取纯文本,无需额外组件,可直接在数据库层完成。

  1. 首先创建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即可。

  1. 调用函数查询结果:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 05:36:06