SQL替换两个字符串之间的所有字符。

5

我正在尝试找到一种方法,只更新/替换两个字符串之间的文本。

例如,我需要能够更新字段,并仅替换以下脚本标记之间的内容,使开头脚本标记之前的文本不受影响。

I want to keep this string<script type="text/javascript" language="javascript">********</script>

我想REPLACE不会起作用,因为脚本标签之间的文本会有所不同。是否有某种通配符?
UPDATE Products_Joined 
SET TechSpecs = REPLACE (CAST(TechSpecs AS NVARCHAR(MAX)), '<script type="text/javascript" language="javascript">********</script>', '<script type="text/javascript" language="javascript">new text</script>' )

更新:根据 @Parkyprg 的回答,以下方法可行但无法替换闭合的 </script> 标签。最终结果如下。

I want to keep this string new text</script>

我们如何同时移除闭合脚本标签呢?
UPDATE Products_Joined
SET TechSpecs = REPLACE(CAST(TechSpecs AS NVARCHAR(MAX)), 
SUBSTRING(CAST(TechSpecs AS NVARCHAR(MAX)),
CHARINDEX('<script type="text/javascript" language="javascript">',TechSpecs),
CHARINDEX('</script>',CAST(TechSpecs AS NVARCHAR(MAX))) - 
CHARINDEX('<script type="text/javascript" language="javascript">',TechSpecs)
),' new text') 

1
请查看这个这个 - Daniel Hilgarth
你的代码中的 nvarchar(max) 与你问题所标记的 sql-server-2000 标签有何关联?SQL Server 2000 不支持字符串的 max 大小说明符。 - Andriy M
也许它不是2000年,真的不确定。 - user357034
嗯,我尝试过了,但是它什么也没返回,也没有错误。 - user357034
@user357034 - 好的。那么您必须至少使用2005版本,因为nvarchar(max)可以工作。如果您执行DECLARE @I INT = 1,是否会出现错误?如果没有,那么您使用的是2008版本。2005版本会给您一个错误提示:Cannot assign a default value to a local variable. - Martin Smith
显示剩余2条评论
2个回答

6
DECLARE @OpenTag varchar(100)
SET @OpenTag = '<script type="text/javascript" language="javascript">'

UPDATE Products_Joined
SET TechSpecs  = STUFF(TechSpecs ,
                       CHARINDEX(@OpenTag, TechSpecs ,1)  + LEN(@OpenTag),
                            CHARINDEX('</script>',TechSpecs ,1)-(CHARINDEX(@OpenTag, TechSpecs ,1)  + LEN(@OpenTag)), 
                       'New Text')

@user357034 - 是的。这可以追溯到Sybase时代。你说的“不工作”是什么意思?你收到了错误吗?它没有更新任何内容吗?对我来说很好用。 - Martin Smith
由于派生表“derived”中的某一列是派生或常量,因此无法更新该派生表。在SQL Server 2000上。 - Mikael Eriksson
1
@MikaelEriksson - 啊,谢谢。那我就放弃派生表,把所有东西都内联起来。只是为了避免重复表达式才用派生表的。不过我注意到问题中OP提到了nvarchar(max)!? - Martin Smith
@user357034 - 所以这不是 SQL Server 2000,但数据类型是text - Mikael Eriksson
真的不确定,知识有限,VARCHAR(MAX)) 也可以使用。 - user357034
显示剩余2条评论

2

这可能不是最佳解决方案,但是...


(注:保留HTML标签)
UPDATE Products_Joined
SET TechSpecs = REPLACE(TechSpecs, 
SUBSTRING(TechSpecs,
  CHARINDEX('<script type="text/javascript" language="javascript">',TechSpecs),
  CHARINDEX('</script>',TechSpecs) - 
  CHARINDEX('<script type="text/javascript" language="javascript">',TechSpecs)
)
FROM MyTable

你需要添加被替换的内容 - 目前,REPLACE函数只有两个参数,并且缺少一个 ) - user359040
好的,稍加修改后这个确实能工作,但并不能替换掉闭合的</script>标签。 - user357034

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接