SQL替换WHERE子句

问题描述 投票:4回答:3

我们编写了以下查询,用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;]%' 
sql sql-server sql-server-2014
3个回答
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条件:&_ _ _ _ _;(为了清晰起见,添加了间距)

也许你可以利用这个优势?


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

0
投票

我认为这将完成这项工作:

 UPDATE STOCKMEM
 SET INETFDESC = CAST(
                 REPLACE(
                     CAST(INETFDESC as NVarchar(MAX)), '& ', '&amp ')
                 ) AS NText
              )

如果&是任何标签的一部分,它将不会跟随空格,所以将每个&替换为空格,然后用空格替换&amp

© www.soinside.com 2019 - 2024. All rights reserved.