SQL替换WHERE子句

时间:2017-02-22 04:37:07

标签: sql sql-server sql-server-2014

我们有以下查询,用于替换任何&在具有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;]%' 

3 个答案:

答案 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)), '& ', '&amp ')
                 ) AS NText
              )

如果&是任何代码的一部分,则不会跟空格一致,因此请将每个&后跟空格替换为&amp,后跟空格。