我的表格带有description
列。该栏目中有一些HTML。
然后html传递给页面并渲染它。但有时会有满足的评论,有时它们不会被关闭。我需要清理这些数据。
我通过
找到了它们select * from table where description like '%<!--%'`
我认为它不正确,但我不知道如何做得更好。
你能建议解决我的问题吗?
修改的
这是一些例子。
<div class="text"> some data </div>
<ul><!-- Some comment -->
<li>test</li>
<li>test2</li> <!-- Some comment
</ul>
问候,德米特里。
答案 0 :(得分:3)
试试这个 -
<强>查询:强>
DECLARE @temp TABLE
(
id INT IDENTITY(1,1)
, [description] NVARCHAR(MAX)
)
INSERT INTO @temp ([description])
VALUES ('
<div class="text"> some data <!--test</div>
<ul>
<li>test</li>
<li>test2</li> <!-- Some comment
</ul>')
;WITH cte AS
(
SELECT t.id, t.token
FROM (
SELECT
t.id
, token =
SUBSTRING(
t.[description]
, number
, ABS(CHARINDEX('<', t.[description], number + 1) - number))
FROM @temp t
CROSS JOIN [master].dbo.spt_values n
WHERE [type] = 'p'
AND number <= LEN(t.[description]) - 1
AND SUBSTRING(t.[description], number, 1) = '<'
) t
WHERE t.token NOT LIKE '<!--%'
)
UPDATE t
SET [description] = (
SELECT c.token
FROM cte c
WHERE c.id = t.id
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)')
FROM @temp t
SELECT *
FROM @temp
<强>结果:强>
<div class="text"> some data </div>
<ul>
<li>test</li>
<li>test2</li>
</ul>
答案 1 :(得分:1)
使用CASE WHEN
检查是否存在打开的注释序列以及是否存在关闭注释序列,并返回一个在必要时添加结束注释的列。
SELECT * ,
CASE WHEN CHARINDEX('<!--', description) > 0
AND CHARINDEX('-->', description) = 0
THEN description + '-->'
ELSE description
END AS clean_description
FROM dbo.[table]
或者,如果您想删除损坏的评论,请使用
SUBSTRING(description, 0, CHARINDEX('<!--', description))
表示语句的THEN
分支。