2017-02-22 11 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句の文字列は、セミコロンに続く3つの文字___続い&が含まれていないので、これは、値を返しません。

SELECT REPLACE('This is &[^amp;] just a test.','&[^amp;]','&') 
WHERE 'This is &[^amp;] just a test.' LIKE '%&_____;%' 

LIKE条件がWHERE句の文字列によって満たされているので、これは、値を返します。&_ _ _ _ _;(間隔はわかりやすくするために追加された)

たぶん、あなたはあなたの利点にそれを使用することができますか?

0

これはきれいではありませんが、それは仕事だと思います。 考え方は、エンティティの一部ではないすべてのアンパサンドを見つけることです。 ここでは、エンティティはアンパサンド、1文字、さらにいくつかの文字、次にセミコロンとみなされます。

私はこれが仕事をすると思います
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にスペースが続くすべての&に取って代わることはありませんスペース。