SQL Select Query返回5,448行,更新查询会影响93,205行,但实际上没有更新任何内容?

时间:2015-12-21 19:21:00

标签: sql sql-server

如果我这样做:

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)受影响)

但实际上没有任何改变。我尝试了一个特定的记录,它说它受到影响,但数据保持不变。

2 个答案:

答案 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应用正则表达式,然后合并更改。