2017-02-22 106 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之後空間。