SQL 服务器中的用户定义函数有问题

Problem with user-defined function in SQL Server

我在 Microsoft SQL Server 中有一个用户定义的函数,但我无法使其正常工作。

该函数接受一个 NVARCHAR(MAX) 参数,然后从该字符串文本中去除所有 HTML 标记,然后通过光标删除所有多余的空格

CREATE FUNCTION UDF_STRIP_HTML 
     (@HTMLText NVARCHAR(MAX))
RETURNS NVARCHAR(MAX) AS
BEGIN
    DECLARE @Start INT
    DECLARE @End INT
    DECLARE @Length INT

    SET @Start = CHARINDEX('<',@HTMLText)
    SET @End = CHARINDEX('>',@HTMLText,CHARINDEX('<',@HTMLText))
    SET @Length = (@End - @Start) + 1

    WHILE @Start > 0 AND @End > 0 AND @Length > 0
    BEGIN
        SET @HTMLText = STUFF(@HTMLText, @Start, @Length, '')
        SET @Start = CHARINDEX('<', @HTMLText)
        SET @End = CHARINDEX('>', @HTMLText, CHARINDEX('<', @HTMLText))
        SET @Length = (@End - @Start) + 1
    END

    DECLARE @WORD VARCHAR(MAX)
    DECLARE @STRING VARCHAR(MAX)
    DECLARE AUDIT_TRAIL_CURSOR CURSOR 
    FOR 
        --Split string into individual words and ignore blanks or extra spaces
        SELECT VALUE 
        FROM STRING_SPLIT(@HTMLText, ' ') 
        WHERE LTRIM(RTRIM(VALUE)) <> ''

    OPEN AUDIT_TRAIL_CURSOR

    FETCH NEXT FROM AUDIT_TRAIL_CURSOR INTO @WORD

    WHILE @@FETCH_STATUS = 0
    BEGIN 
        --Strip extra spaces from each word and add only one space after
        SET @STRING = CONCAT(@STRING, RTRIM(LTRIM(@WORD)), ' ')

        FETCH NEXT FROM AUDIT_TRAIL_CURSOR INTO @WORD
    END

    CLOSE AUDIT_TRAIL_CURSOR
    DEALLOCATE AUDIT_TRAIL_CURSOR

    RETURN @STRING
END
GO

HTML 剥离器在任何一种方式下都可以正常工作,但是空白剥离器只有在我直接传入像

这样的硬编码字符串时才有效

这个有效:

SELECT dbo.UDF_STRIP_HTML('Some <b/>      string   with        Words.   ') 

HTML 剥离器有效,但空白剥离器不起作用:

SELECT dbo.UDF_STRIP_HTML(some_column) 
FROM some_table 

注意:我知道这可能不是最好的功能,但这将用于通过查询一次性导出数据

XML 有很多有用的数据类型。其中之一:token 对您的场景非常方便。

这是它的作用:

  1. 所有不可见的 TAB、Carriage Return 和 Line Feed 字符将被 替换为 spaces.
  2. 然后从值中删除前导和尾随 space。
  3. 此外,连续出现的多个 space 将替换为单个 space。

您可以替换整个块:

DECLARE @WORD VARCHAR(MAX)
    DECLARE @STRING VARCHAR(MAX)
    DECLARE AUDIT_TRAIL_CURSOR CURSOR 
    FOR 
    --Split string into induvidual words and ignore blanks or extra spaces
    SELECT VALUE FROM STRING_SPLIT(@HTMLText, ' ') WHERE LTRIM(RTRIM(VALUE)) <> ''
    OPEN AUDIT_TRAIL_CURSOR
    FETCH NEXT FROM AUDIT_TRAIL_CURSOR INTO @WORD
    WHILE @@FETCH_STATUS = 0
    BEGIN 
        --Strip extra spaces from each word and add only one space after
        SET @STRING = CONCAT(@STRING,RTRIM(LTRIM(@WORD)),' ')
        FETCH NEXT FROM AUDIT_TRAIL_CURSOR INTO @WORD
    END
    CLOSE AUDIT_TRAIL_CURSOR
    DEALLOCATE AUDIT_TRAIL_CURSOR
    RETURN @STRING

具有以下内容:

RETURN TRY_CAST('<r><![CDATA[' + @HTMLText + ']]></r>' AS XML).value('(/r/text())[1] cast as xs:token?','NVARCHAR(MAX)');