我们编写了以下查询,用HTML等效项(&)替换任何&在备注字段中。在编写时,我们没有考虑到字段中可能存在其他HTML标记,这些标记也以“&”开头(即 - “etc”。因为我们必须确保所有的&符号在单独使用时不是HTML的等价物而不是另一个标签我们必须跳过那些在另一个标签的一部分。那就是说,最短的HTML标签可以以&开头似乎是3个字符,最长的似乎是6个字符,所以&_ _ _;到&_ _ _ _ _ _;详细信息...有没有关于更新where子句的想法,以便它不会更新任何&在&后面的4-7个字符中以“;”继续进行&?谢谢。
UPDATE STOCKMEM
SET INETFDESC = CAST(
REPLACE(
REPLACE(
CAST(INETFDESC as NVarchar(MAX))
,'&','&')
, '&', ,'&')AS NText)
WHERE INETFDESC LIKE '%&[^amp;]%'
可能不是处理这个问题的最好方法,但......
您可以使用下划线_
作为指示,在该位置应该有一些字符,这有效地使它成为像这样的情况下的字符计数器。只是一个简单的例子:
SELECT REPLACE('This is &[^amp;] just a test.','&[^amp;]','&')
WHERE 'This is &[^amp;] just a test.' LIKE '%&___;%'
这不会返回一个值,因为WHERE
子句中的字符串不包括&
后跟三个字符_
_
_
后跟一个分号。
SELECT REPLACE('This is &[^amp;] just a test.','&[^amp;]','&')
WHERE 'This is &[^amp;] just a test.' LIKE '%&_____;%'
这将返回一个值,因为LIKE
条件中的字符串符合WHERE
条件:&_ _ _ _ _;
(为了清晰起见,添加了间距)
也许你可以利用这个优势?
这不是很好,但我认为它完成了这项工作。我们的想法是找到所有不属于实体的&符号。在这里,假设实体是&符号,一个字母,一些字符,然后是半列。
set nocount on
--drop table #HtmlTest
select CONVERT( nvarchar(255) ,
N'The & & z; HTML & replacement < > é ε test & a; ' ) as test
into #HtmlTest
select test from #HtmlTest
declare @posStart int, @posStart1 int, @posStart2 int, @posEnd int, @isEntity bit
set @posStart = 1
while (@posStart != 0)
begin
select @posStart1 = charindex('&', test, @posStart + 1) from #HtmlTest
select @posStart2
= patindex('%&[a-z]%;%', substring(test, @posStart + 1, 99999))
+ @posStart from #HtmlTest
set @isEntity = IIF(@posStart1 = @posStart2, 1, 0)
select @posEnd = charindex(';', test, @posStart1 + 1) from #HtmlTest
set @posStart = @posStart1
if (@isEntity = 0 and @posStart1 > 0)
begin
update #HtmlTest
set test = SUBSTRING(test, 1, @posStart1 - 1) + '&'
+ SUBSTRING(test, @posStart1 + 1, 999999)
select test from #HtmlTest
set @posStart += 4
end
end
select test from #HtmlTest
set nocount off
我认为这将完成这项工作:
UPDATE STOCKMEM
SET INETFDESC = CAST(
REPLACE(
CAST(INETFDESC as NVarchar(MAX)), '& ', '& ')
) AS NText
)
如果&
是任何标签的一部分,它将不会跟随空格,所以将每个&
替换为空格,然后用空格替换&
。