如果我这样做:
SELECT *
FROM [myDB].[dbo].[content]
where content_html like '%<images>%<img src=''/'' alt=''''>%</img>%</images>%'
它返回5,448行。
那些空的图片标签打破了我在Ektron中的拉力 - 我们目前的CMS。他们建议我用
替换那些空图像标签所以我做了这个更新查询:
UPDATE [myDB].[dbo].[content]
SET content_html=REPLACE(CONVERT(VARCHAR(MAX), content_html),'%<images>%<img src=''/'' alt=''''>%</img>%</images>%','<images></images>')
它返回:( 93205行(s)受影响)
但实际上没有任何改变。我尝试了一个特定的记录,它说它受到影响,但数据保持不变。
答案 0 :(得分:0)
首先,第二个中缺少第一个查询的where子句:
其次,除非您想要替换整个字段,否则您不希望在替换语句中使用前导和尾随通配符。我不知道你是否甚至可以在替换命令中使用通配符 - 它在我读过的任何Microsoft文档中都没有用作示例,并且一些谷歌搜索没有产生任何结果:
UPDATE [myDB].[dbo].[content]
SET content_html=REPLACE(CONVERT(VARCHAR(MAX), content_html),'<images>%<img src=''/'' alt=''''>%</img>%</images>','<images></images>')
where content_html like '%<images>%<img src=''/'' alt=''''>%</img>%</images>%'
修改强>
测试这个的一个非常简单的方法是:
SELECT content_html as [Original], REPLACE(CONVERT(VARCHAR(MAX), content_html),'%<images>%<img src=''/'' alt=''''>%</img>%</images>%','<images></images>') as [Replaced]
FROM YourTable
WHERE content_html like '%<images>%<img src=''/'' alt=''''>%</img>%</images>%'
此查询将为您提供原始值 - 以及您正在创建的替换值 - 并且仅针对与您的like表达式匹配的记录。如果两列不同,则可以正常工作。如果它们相同,则不会,您需要使用其他代码来完成所需的结果。
最终编辑:
我测试了这个,REPLACE只适用于文字字符串。您的通配符不适用于您的替换功能,您将需要非常复杂的SQL或应用程序代码来实现您的目标。应用程序路线呈指数级增长,所以就这样做!祝你好运!
答案 1 :(得分:0)
您的更新语句没有WHERE子句。这意味着它将在每一行上运行。即使content_html
中的数据没有改变,UPDATE语句也会再次将其重写回表。为什么?因为这就是你告诉它的目的。
您需要使用它来仅影响您想要的5448行:
UPDATE [myDB].[dbo].[content]
SET content_html=REPLACE(CONVERT(VARCHAR(MAX), content_html),'%<images>%<img src=''/'' alt=''''>%</img>%</images>%','<images></images>')
where content_html like '%<images>%<img src=''/'' alt=''''>%</img>%</images>%'
但是,您仍然不太可能做任何事情,因为REPLACE()函数是字符串文字替换。它对LIKE使用的通配符一无所知。因此查询是模式匹配以查找要更新的行,但不会在%<images>%<img src='/' alt=''>%</img>%</images>%
中找到文本字符串content_html
,而REPLACE()函数可能永远不会找到它。
SQL Server中没有内置的正则表达式替换功能。有other options,但我不认为它们对你特别有用。您可以使用一系列PATINDEX()调用来查找<images>
和<img src='/' alt=''>
以及</images>
,使用一些比较来确定<img
标记是否在其中,然后使用STUFF(),但是在不知道你的数据的情况下,我无法知道它的效果如何。
使用真正的正则表达式替换的最简单方法可能是将字段选择为DataTable,从C#或PowerShell应用正则表达式,然后合并更改。