2017-02-22 15 views
4

У нас есть следующий запрос, который был написан для замены любого & в поле memo с эквивалентом HTML (&). Когда мы писали, мы не учитывали, что есть потенциально другие теги HTML в поле, которые также начинаются с «&» (т. Е. — " и т. Д.). Поскольку мы должны гарантировать, что все амперсанды являются эквивалентом HTML при использовании отдельно, а не в части другого тега, мы должны пропустить те, которые на части другого тега. Тем не менее, самый короткий тег HTML, который может начинаться с &, кажется, составляет 3 символа, а самый длинный - шесть символов, поэтому & _ _ _; до & _ _ _ _ _ _; в длину ... есть ли какие-либо идеи по обновлению предложения 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

Не уверен, что это вариант, но если бы у меня была такая проблема, я бы использовал SSIS с задачей сценария C# – RoundFour

+0

Эти вещи обычно обрабатываются лучше, используя язык программирования, а затем в sql. – ATC

ответ

0

Наверное, не самый лучший способ справиться с этой проблемой, но ...

Вы можете использовать подчеркивание _ как показатель того, что там должен быть какой-то символ в том месте, которое эффективно делает его характер -counter в такой ситуации. Просто быстрый пример:

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 с последующим пространство.

 Смежные вопросы

  • Нет связанных вопросов^_^