我有一个 SQL Server 2008 表,其中有一列包含冗长的 HTML 文本。在靠近顶部的地方,有一个链接提供给每条记录唯一的相关 MP3 文件。链接的格式都如下:
<div class="MediaSaveAs"><a href="filename??.mp3">Download Audio </a></div>
不幸的是,许多记录包含此链接的两个或三个连续且相同的实例,而应该只有一个。我可以运行一个相对简单的脚本来查找和消除冗余链接吗?
我有一个 SQL Server 2008 表,其中有一列包含冗长的 HTML 文本。在靠近顶部的地方,有一个链接提供给每条记录唯一的相关 MP3 文件。链接的格式都如下:
<div class="MediaSaveAs"><a href="filename??.mp3">Download Audio </a></div>
不幸的是,许多记录包含此链接的两个或三个连续且相同的实例,而应该只有一个。我可以运行一个相对简单的脚本来查找和消除冗余链接吗?
我不完全确定-因为您的解释不是很清楚-但这似乎可以满足您的要求,尽管您是否认为这是一个“简单的脚本”,我不知道。
declare @Link nvarchar(200) = N'<div class="MediaSaveAs"><a href="filename123.mp3">Download Audio </a></div>'
declare @BadData nvarchar(max) = N'cbjahcgfhjasgfzhjaucv' + replicate(@Link, 3) + N'cabhjcsghagj',
@StartPattern nvarchar(34) = N'<div class="MediaSaveAs"><a href="',
@EndPattern nvarchar(27) = N'">Download Audio </a></div>'
select @BadData
select replace (
@BadData,
substring(@BadData, charindex(@StartPattern, @BadData), len(@BadData)-charindex(reverse(@EndPattern), reverse(@BadData))-charindex(@StartPattern, @BadData) + 2),
substring(@BadData, charindex(@StartPattern, @BadData), charindex(@EndPattern, @BadData) + len(@EndPattern) - charindex(@StartPattern, @BadData))
)
就我个人而言,我不想维护这段代码;我宁愿使用可以实际解析 HTML 的另一种语言的脚本。您说这“只是一个重复的文本问题”,但这并不意味着这是一个简单的问题,尤其是在像 TSQL 这样对字符串操作支持如此有限的语言中。
为了将来参考,请将所有相关信息放入问题中 - 如果需要,您可以对其进行编辑 - 而不是将它们留在难以阅读且可能被忽略的评论中。并且请发布示例数据和结果,而不是用文字描述事物。
首先我们需要识别文件名,我们可以用 PATINDEX 来做:
select
substring(html, PATINDEX('%filename%.mp3%', html), PATINDEX('%.mp3%', html)-PATINDEX('%filename%.mp3%', html)+4)
from files
然后其次识别和重复,检查它:
delete
from files
where id not in (
select max(id)
from files
group by substring(html, PATINDEX('%filename%.mp3%', html), PATINDEX('%.mp3%', html)-PATINDEX('%filename%.mp3%', html)+4)
)