首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调试rtf to text函数

调试rtf to text函数
EN

Stack Overflow用户
提问于 2018-01-19 04:11:29
回答 2查看 1.1K关注 0票数 0

我有一个函数,我们用来将RTF格式的文本转换为纯文本。它在过去工作得很好,到目前为止,在有问题的文本上似乎工作得很好。

然而,在我的230,000条记录的数据集中,它发出了一个错误的SUBSTRING调用,并中止了整个过程(没有告诉我有问题的记录)。

有没有什么方法可以让我得到一些反馈?我知道SQLServer函数不允许使用打印语句或插入语句。230,000条记录的数据集不是我的,而是一个客户。我真的不想试着一条又一条记录,看看是哪一个导致了错误。

SQL函数如下:

代码语言:javascript
复制
CREATE FUNCTION [dbo].[RTF2Text]
(
    @rtf nvarchar(max)
)
RETURNS nvarchar(max)
AS
BEGIN
DECLARE @Pos1 int;
DECLARE @Pos2 int;
DECLARE @hex varchar(316);
DECLARE @Stage table
(
    [Char] char(1),
    [Pos] int
);
INSERT @Stage
    (
       [Char]
     , [Pos]
    )
SELECT SUBSTRING(@rtf, [Number], 1)
     , [Number]
  FROM [master]..[spt_values]
 WHERE ([Type] = 'p')
   AND (SUBSTRING(@rtf, Number, 1) IN ('{', '}'));
SELECT @Pos1 = MIN([Pos])
     , @Pos2 = MAX([Pos])
  FROM @Stage;
DELETE
  FROM @Stage
 WHERE ([Pos] IN (@Pos1, @Pos2));
WHILE (1 = 1)
    BEGIN
        SELECT TOP 1 @Pos1 = s1.[Pos]
             , @Pos2 = s2.[Pos]
          FROM @Stage s1
            INNER JOIN @Stage s2 ON s2.[Pos] > s1.[Pos]
         WHERE (s1.[Char] = '{')
           AND (s2.[Char] = '}')
        ORDER BY s2.[Pos] - s1.[Pos];
        IF @@ROWCOUNT = 0
            BREAK
        DELETE
          FROM @Stage
         WHERE ([Pos] IN (@Pos1, @Pos2));
        UPDATE @Stage
           SET [Pos] = [Pos] - @Pos2 + @Pos1 - 1
         WHERE ([Pos] > @Pos2);
        SET @rtf = STUFF(@rtf, @Pos1, @Pos2 - @Pos1 + 1, '');
    END
SET @rtf = REPLACE(@rtf, '\pard', '^*^');
SET @rtf = REPLACE(@rtf, '\par', '^*^');
SET @rtf = REPLACE(@rtf, '\t', '^~^');
SET @rtf = STUFF(@rtf, 1, CHARINDEX(' ', @rtf), '');
IF len(@rtf) > 0
    WHILE (Right(@rtf, 1) IN (' ', CHAR(13), CHAR(10), '}'))
      BEGIN
        SELECT @rtf = SUBSTRING(@rtf, 1, (LEN(@rtf + 'x') - 2));
        IF LEN(@rtf) = 0 BREAK
    END
SET @Pos1 = CHARINDEX('\''', @rtf);
WHILE @Pos1 IS NOT NULL AND @Pos1 > 0
    BEGIN
        IF @Pos1 IS NOT NULL AND @Pos1 > 0
            BEGIN
                SET @hex = '0x' + SUBSTRING(@rtf, @Pos1 + 2, 2);
                SET @rtf = REPLACE(@rtf, SUBSTRING(@rtf, @Pos1, 4), CHAR(CONVERT(int, CONVERT (binary(1), @hex,1))));
                SET @Pos1 = CHARINDEX('\''', @rtf);
            END
    END
SET @rtf = COALESCE(@rtf, '') + ' ';
SET @Pos1 = PATINDEX('%\%[0123456789][\ ]%', @rtf);
WHILE @Pos1 IS NOT NULL AND @Pos1 > 0 AND @rtf != ''
    BEGIN
        SET @Pos2 = CHARINDEX(' ', @rtf, @Pos1 + 1);
        IF @Pos2 < @Pos1
            SET @Pos2 = CHARINDEX('\', @rtf, @Pos1 + 1);
        IF @Pos2 < @Pos1
            BEGIN
                SET @rtf = SUBSTRING(@rtf, 1, @Pos1 - 1);
                SET @Pos1 = 0;
            END
        ELSE
            BEGIN
                SET @rtf = STUFF(@rtf, @Pos1, @Pos2 - @Pos1 + 1, '');
                SET @Pos1 = PATINDEX('%\%[0123456789][\ ]%', @rtf);
            END
    END
IF RIGHT(@rtf, 1) = ' '
    SET @rtf = SUBSTRING(@rtf, 1, LEN(@rtf) -1);
RETURN @rtf;
END
EN

回答 2

Stack Overflow用户

发布于 2018-01-19 07:59:41

无意冒犯,但你真的测试过你的函数吗?

您是否运行过单元测试来尝试破坏您的函数,例如无效值、边界条件等?

您是否查看了文档,以了解SUBSTRING在什么情况下会抛出异常?

我已经运行了这些案例,并得到了异常:

代码语言:javascript
复制
SELECT dbo.[RTF2Text]( NULL )
SELECT dbo.[RTF2Text]( '' )
SELECT dbo.[RTF2Text]( '1' )
SELECT dbo.[RTF2Text]( 'blah' )

如果您知道函数在什么条件/输入值下会失败,那么只需在表中检查这些条件/输入值。

票数 0
EN

Stack Overflow用户

发布于 2020-07-07 06:09:26

我遇到过类似的情况,对SQL函数知之甚少,但需要剥离RTF并尝试此代码。调试表明这个函数在这里失败,因为我得到了无效的长度参数。

代码语言:javascript
复制
IF RIGHT(@rtf, 1) = ' '
    SET @rtf = SUBSTRING(@rtf, 1, LEN(@rtf) -1);

由于我的知识和时间都很少,所以我只增加了一秒钟的if,以确保它不会从0中减去,即-1,这对我的数据集有效。

代码语言:javascript
复制
    IF RIGHT(@rtf, 1) = ' '
IF LEN(@rtf) > 0
    SET @rtf = SUBSTRING(@rtf, 1, LEN(@rtf) -1);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48329539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档