我试图创建一个内联表函数来去除HTML(这样我就可以用另一个表CROSS APPLY
来创建它。我们有一个标量函数,但性能不够好。
我真的很擅长使用T-SQL,所以我不知道它有很多好的做法,所以如果有人有任何建议,请告诉我!
这是我到目前为止所做的:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION StripHTML
(
@text VARCHAR(MAX)
)
RETURNS TABLE
AS
RETURN
WITH BracketIndexes (startIndex, stopIndex) AS (SELECT
CHARINDEX('<', @text),
CHARINDEX('>', @text) UNION ALL SELECT
CHARINDEX('<', @text, stopIndex + 1),
CHARINDEX('>', @text, stopIndex + 1)
FROM BracketIndexes
WHERE startIndex > 0 AND stopIndex > 0
)
SELECT * FROM BracketIndexes
现在我有<
和>
所在的索引,我不知道如何:
我认为我可以使用LEFT
/ RIGHT
连接每个方括号的左侧和右侧,但我似乎无法使指数正确。< / p>
编辑:
这种方式有用:
DECLARE @text VARCHAR(100) = 'HELLO <B>WORLD</B> asd';
WITH BracketIndexes (startIndex, stopIndex) AS (
SELECT
CHARINDEX('<', @text),
CHARINDEX('>', @text)
UNION ALL
SELECT
CHARINDEX('<', @text, stopIndex + 1) - (stopIndex - startIndex + 1),
CHARINDEX('>', @text, stopIndex + 1) - (stopIndex - startIndex + 1)
FROM BracketIndexes
WHERE startIndex > 0 AND stopIndex > 0
)
SELECT @text = LEFT(@text, startIndex - 1) + RIGHT(@text, LEN(@text) - stopIndex)FROM BracketIndexes WHERE startIndex > 0 AND stopIndex > 0
SELECT @text
但是当我在@text
中添加更多HTML语句时,RIGHT
的长度参数不正确。
答案 0 :(得分:3)
你是在正确的道路上。对于CTE的每次递归,您希望使用REPLACE()和SUBSTRING()的组合基本上用空格替换一个HTML元素:
DECLARE @text varchar(max) = '<a href="">Cool!</a><b>oh yeah!</b>'
;WITH BracketIndexes (rowNumber, original, startIndex, stopIndex, replaced) AS (SELECT
1,
@text,
CHARINDEX('<', @text),
CHARINDEX('>', @text),
REPLACE(@text,SUBSTRING(@text,CHARINDEX('<', @text),CHARINDEX('>', @text)),'') UNION ALL SELECT
rowNumber+1,
replaced,
CHARINDEX('<', replaced),
CHARINDEX('>', replaced),
REPLACE(replaced,SUBSTRING(replaced,CHARINDEX('<', replaced),CHARINDEX('>', replaced)),'')
FROM BracketIndexes
WHERE startIndex > 0 AND stopIndex > 0
)
SELECT TOP 1
replaced
FROM
BracketIndexes
ORDER BY RowNumber DESC
答案 1 :(得分:0)
你可以非常简单地尝试这样的事情。当然没有经过充分测试
declare @str varchar(max)='<table><th>abc</th><tr><td>def</td></tr></table>'
select @str=replace(replace(@str,'<','~<'),'>','>~')
select * from dbo.split('~',@str) where value<>'' and SUBSTRING(value,1,1)<>'<'
仅将其视为逻辑。当然案件可能会失败