2013-08-16 8 views
0

У меня есть поле HTML, которое содержит HTML для всей веб-страницы, которая извлекается из документа Word.Найти/заменить строки в столбце SQL

В этом HTML может быть следующим:

<p>Please refer to &lt;|Any combination of words|&gt; policy.</p> 

Все, что между | и | мне нужно захватить. Фокус в том, что во всем документе есть несколько |'s, поэтому он должен быть только |'s между Please refer to and policy.

я тогда нужно заменить, что с HTML ссылка <a href="Any combination of words">Any combination of words</a>

Итак, если я побежал код на ниже:

<p>Please refer to &lt;|Specific Policy Name|&gt; policy.</p> 

Было бы заменить этот &lt;|Specific Policy Name|&gt; с:

<a href="Specific Policy Name">Specific Policy Name</a> 

Это возможно с SQL?

+0

Так вся страница хранится в одной строке таблицы? – Elias

+0

Нужно ли это делать с помощью SQL? Вы не можете этого сделать, но это не значит, что вам нужно. По крайней мере, посмотрите на CLR и попробуйте создать функцию в .NET, доступную tsql. – JeffO

+0

@Elias HTML для текстового документа находится в столбце yes. –

ответ

1

Попробуйте это решение:

SET NOCOUNT ON; 

DECLARE @MyTable TABLE 
(
    ID INT IDENTITY(1,1) PRIMARY KEY, 
    OldContent NVARCHAR(MAX) NOT NULL, 
    NewContent NVARCHAR(MAX) NULL 
); 
INSERT INTO @MyTable (OldContent) 
VALUES (N'<p>Please refer to &lt;|Specific Policy Name&lt;| policy.</p>'); 

WITH UpdateCTE 
AS 
(
    SELECT b.NewContent,STUFF(b.InnerText,b.StartIndex-5,b.EndIndex-b.StartIndex+10,'<a href="'+b.[Text]+'">'+b.[Text]+'</a>') AS ChangedText 
    FROM 
    (
     SELECT a.*,SUBSTRING(a.InnerText,a.StartIndex,a.EndIndex-a.StartIndex) AS [Text] 
     FROM 
     (
      SELECT PATINDEX('%Please refer to &lt;|%',t.OldContent)+21 AS StartIndex, 
        PATINDEX('%&lt;| policy.%',t.OldContent) AS EndIndex, 
        t.OldContent AS InnerText, 
        t.NewContent 
      FROM @MyTable t 
     ) a 
    ) b 
) 
UPDATE UpdateCTE 
SET  NewContent = ChangedText; 

SELECT * 
FROM @MyTable x; 

Результаты:

ID OldContent             NewContent 
--- ------------------------------------------------------------- ------------------------------------------------------------------------------------ 
1 <p>Please refer to &lt;|Specific Policy Name&lt;| policy.</p> <p>Please refer to <a href="Specific Policy Name">Specific Policy Name</a> policy.</p> 
+1

Для тестирования вы можете использовать 'SELECT * FROM UpdateCTE' вместо' UPDATE UpdateCTE SET NewContent = ChangedText; '. Не забудьте использовать транзакции ('BEGIN TRANSACTION ... COMMIT/ROLLBACK') при выполнении инструкции' UPDATE'. –

+0

Я пытался заставить это работать, но я сталкиваюсь с ошибками. Я изменил 'VALUES()' на 'select top 1 html from Documents ', который выдает весь« HTML »в« Oldcontent ». Он выдает эту ошибку 'Msg 536, Level 16, State 5, Line 12 Неверный параметр длины передан функции SUBSTRING.' –

+0

@JamesWilson: Попробуйте заменить 'PATINDEX ('% < | policy.%',' With 'PATINDEX ('% < | policy%', '. –