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
对您的场景非常方便。
这是它的作用:
- 所有不可见的 TAB、Carriage Return 和 Line Feed 字符将被
替换为 spaces.
- 然后从值中删除前导和尾随 space。
- 此外,连续出现的多个 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)');
我在 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
对您的场景非常方便。
这是它的作用:
- 所有不可见的 TAB、Carriage Return 和 Line Feed 字符将被 替换为 spaces.
- 然后从值中删除前导和尾随 space。
- 此外,连续出现的多个 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)');