我们有以下查询,用于替换任何&在具有HTML等效(&)的备忘录字段中。在编写时,我们不认为该字段中可能存在其他HTML标记,这些标记也以“&”开头(即 - "等)。因为我们必须确保所有的&符号在单独使用时是HTML等价物而不是另一个标记的一部分,所以我们必须跳过那些在另一个标记的一部分。也就是说,最短的HTML标签可以从&似乎是3个字符,最长的似乎是6个字符,所以& _ _ _;到& _ _ _ _ _ _;在长度...是否有任何关于更新where子句的想法,以便它不会更新任何&进行了一次&#34 ;;"在&?之后的4-7个字符中谢谢。
UPDATE STOCKMEM
SET INETFDESC = CAST(
REPLACE(
REPLACE(
CAST(INETFDESC as NVarchar(MAX))
,'&','&')
, '&', ,'&')AS NText)
WHERE INETFDESC LIKE '%&[^amp;]%'
答案 0 :(得分:0)
可能不是解决此问题的最佳方法,但是......
你可以使用下划线_
作为指示,在那个地方应该有一些角色,这有效地使它成为像这样的情况下的角色计数器。只是一个简单的例子:
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
条件:&_ _ _ _ _;
(为了清晰起见,添加了间距)
也许你可以利用它来获得优势?
答案 1 :(得分:0)
这不是很好,但我认为它能完成这项工作。 我们的想法是找到所有不属于实体的&符号。 在这里,实体被假定为&符号,一个字母,一些字符,然后是半列。
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
答案 2 :(得分:0)
我认为这将完成这项工作:
UPDATE STOCKMEM
SET INETFDESC = CAST(
REPLACE(
CAST(INETFDESC as NVarchar(MAX)), '& ', '& ')
) AS NText
)
如果&
是任何代码的一部分,则不会跟空格一致,因此请将每个&
后跟空格替换为&
,后跟空格。