我在SQL Server2005中有一个包含数百行HTML内容的表。其中一些内容包含HTML,如:
<span class=heading-2>Directions</span>其中的“方向”根据页面名称的不同而变化。
我需要将所有的<span class=heading-2>和</span>标记更改为<h2>和</h2>标记。
我以前编写此查询是为了更改内容,但由于结尾HTML标记的原因,它不适用于我当前的问题:
Update ContentManager
Set ContentManager.Content = replace(Cast(ContentManager.Content AS NVARCHAR(Max)), 'old text', 'new text')有没有人知道我怎样才能完全用T- h2替换掉SQL?我发现的一切都表明我必须进行CLR集成。谢谢!
发布于 2010-04-13 00:01:21
事实上,T-SQL本身并不支持正则表达式,这就是选择正则表达式作为工具的那类问题。首先,我要说的是,解决方案中的复杂程度在很大程度上取决于数据的一致性。例如,假设我们搜索标题为:
Select ..
From ...
Where HtmlContent Like '<span class="heading-2">%'这假设span和class之间没有额外的空格,并且在结束括号前的最后一个双引号之后也没有额外的空格。我们可以编写'%<span%class="heading-2"%>%'来说明空格,但这也会在与任何span标记相同的内容中找到标记为heading-2的div标记。如果后一种情况不应该发生,但是您可能有不同的空格,那么使用这个修改过的模式。我们真正会遇到麻烦的地方是结束标签。假设我们的内容是这样的:
<span class="heading-2"> Foo <span class="heading-3">Bar</span> And Gamma Too</span> .... <span class="heading-4">Fubar Is the right way!</span>...要找到正确的span结束标记来更改为</h2>并非易事。您不能简单地找到第一个</span>并将其更改为</h2>。如果您知道没有嵌套的span标记,那么您可以编写一个用户定义的函数来执行此操作:
Create Function ReplaceSpanToH2( @HtmlContent nvarchar(max) )
Returns nvarchar(max)
As
Begin
Declare @StartPos int
Declare @EndBracket int
Set @StartPos = CharIndex('<span class="heading-2">', @HtmlContent)
If @StartPos = 0
Return @HtmlContent
Set @HtmlContent = Replace(@HtmlContent, '<span class="heading-2">', '<h2>')
-- find next </span>
Set @StartPos = CharIndex('</span>', @HtmlContent, @StartPos)
Set @HtmlContent = Stuff(@HtmlContent, @StartPos, 7, '</h2>')
Return @HtmlContent
End发布于 2010-04-13 03:13:18
如果您肯定所有都是有效的,且您使用的是SQL Server 2005或更高版本,则可以将列转换为XML数据类型并使用XQuery。请参阅http://msdn.microsoft.com/en-us/library/ms345117%28SQL.90%29.aspx
(注意:我还没有尝试过。)
不过,我认为最好的答案是Michael Petito的评论。我会写一个应用程序来做这件事,并使用Html Agility Pack。这将提供一个永久的、可维护的解决方案,几乎在所有情况下都可以工作。
(如果这是一次性的,并且你不关心准确性,那么选择你的毒药。)
发布于 2010-04-13 01:11:02
我对SQL Server并不是很在行,但下面是我尝试做到这一点的方法:
UPDATE TableName SET FieldName = REPLACE(FieldName ,'<span class=heading-2>', '<h2>') SET FieldName = REPLACE(FieldName, '</span>', '</h2>')可能需要发出2条UPDATE语句,我不确定您是否可以以这种方式对同一字段进行操作。操作员确实说出了文本的所有出现。如果我遗漏了什么,请纠正我。
当然,如果有其他您不想更改的<span class=heading-2>或</span>文本,这将不起作用。
https://stackoverflow.com/questions/2623151
复制相似问题