2017-02-22 103 views
4

我们有下面的查询,用于替换备注字段中的任何&,其中包含HTML等效项(&)。在撰写时,我们并不认为该字段中还有可能以“&”开头的其他HTML标签(即— "等)。既然我们必须确保所有的&符号是单独使用时的HTML等价物,而不是另一个标签的一部分,我们必须跳过那些在另一个标签中的部分。也就是说,最短的HTML标签可以以&开头,似乎是3个字符,最长的似乎是6个字符,所以& _ _ _;到& _ _ _ _ _ _;在长度...有没有更新where子句的任何想法,以便它不更新任何&这是继续与“;”在接下来的4-7个字符后&?谢谢。SQL替换WHERE子句

UPDATE STOCKMEM 
SET INETFDESC = CAST(
         REPLACE(
           REPLACE(
             CAST(INETFDESC as NVarchar(MAX)) 
           ,'&','&') 
         , '&', ,'&')AS NText) 
    WHERE INETFDESC LIKE '%&[^amp;]%' 
+0

您是否考虑过使用RegEx? http://stackoverflow.com/questions/8928378/using-regex-in-sql-server – Svek

+0

不知道如果这是一个选项,但如果我有这个问题,我会用一个C#脚本任务使用SSIS – RoundFour

+0

这些事情通常使用编程语言,然后在sql中处理得更好。 – ATC

回答

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之后空间。