Замена содержимого HTML с помощью SQL UPDATE - PullRequest
1 голос
/ 08 марта 2012

Я работаю над некоторыми инструкциями Patch Update, которые я хочу использовать для обновления данных контента до новой версии программного обеспечения.Итак, у меня есть база данных для версии X и я хочу обновить содержимое до версии Y.

Внутри базы данных у меня есть таблицы с полями (: text или varchar), включая содержимое HTML.

Тамгиперссылки, которые мне нужно обновить до нового вида URL.

Пример:

<a href="_UpInclude/scriptEx/__TQinfoBaseImage.asp?rq_RecordId=28177&rq_MasterId=28177&rq_Revision=1">Link1</a>

Новое:

<a href="/ror/current/28177.image">Link1</a>

Поэтому мне нужно найти ссылки (без учета регистра), захватите идентификатор и замените его новой ссылкой.Поэтому я ищу замену "regex", но пока не нашел никакой информации об этом.

Что-то вроде:

UPDATE table 
SET field = RegExReplace(content_column,
                         '.*__TQinfoBaseImage.asp?.*rq_MasterId=(\d+).*',
                         '/ror/current/(\d+).image')

Кто-нибудь знает, как это сделать?Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 08 марта 2012

Это дает именно то, что вам нужно. Прежде всего создайте функцию. Я использую ваши данные для примера.

CREATE  FUNCTION [dbo].[RegexReplace]
(
  @pattern VARCHAR(255),
  @replacement VARCHAR(255),
  @Subject VARCHAR(4000),
  @global BIT = 1,
 @Multiline bit =1
)
RETURNS VARCHAR(4000)
/*MORE DETAILS @ http://www.simple-talk.com/sql/t-sql-programming/tsql-regular-expression-    workbench/ */

AS BEGIN
DECLARE @objRegexExp INT,
    @objErrorObject INT,
    @strErrorMessage VARCHAR(255),
    @Substituted VARCHAR(8000),
    @hr INT,
    @Replace BIT

SELECT  @strErrorMessage = 'creating a regex object'
EXEC @hr= sp_OACreate 'VBScript.RegExp', @objRegexExp OUT
IF @hr = 0 
    SELECT  @strErrorMessage = 'Setting the Regex pattern',
            @objErrorObject = @objRegexExp
IF @hr = 0 
    EXEC @hr= sp_OASetProperty @objRegexExp, 'Pattern', @pattern
IF @hr = 0 /*By default, the regular expression is case sensitive. Set the IgnoreCase  property to True to make it case insensitive.*/
    SELECT  @strErrorMessage = 'Specifying the type of match' 
IF @hr = 0 
    EXEC @hr= sp_OASetProperty @objRegexExp, 'IgnoreCase', 0
IF @hr = 0 
    EXEC @hr= sp_OASetProperty @objRegexExp, 'MultiLine', @Multiline
IF @hr = 0 
    EXEC @hr= sp_OASetProperty @objRegexExp, 'Global', @global
IF @hr = 0 
    SELECT  @strErrorMessage = 'Doing a Replacement' 
IF @hr = 0 
    EXEC @hr= sp_OAMethod @objRegexExp, 'Replace', @Substituted OUT,
        @subject, @Replacement
 /*If the RegExp.Global property is False (the default), Replace will return the @subject string with the first regex match (if any) substituted with the replacement text. If RegExp.Global is true, the @Subject string will be returned with all matches replaced.*/   
IF @hr <> 0 
    BEGIN
        DECLARE @Source VARCHAR(255),
            @Description VARCHAR(255),
            @Helpfile VARCHAR(255),
            @HelpID INT

        EXECUTE sp_OAGetErrorInfo @objErrorObject, @source OUTPUT,
            @Description OUTPUT, @Helpfile OUTPUT, @HelpID OUTPUT
        SELECT  @strErrorMessage = 'Error whilst '
                + COALESCE(@strErrorMessage, 'doing something') + ', '
                + COALESCE(@Description, '')
        RETURN @strErrorMessage
    END
   EXEC sp_OADestroy @objRegexExp
   RETURN @Substituted
END


--EXAMPLE
DECLARE @YourLink AS VARCHAR(1000)
SELECT @YourLink = '<a href="_UpInclude/scriptEx/__TQinfoBaseImage.asp?   rq_RecordId=28177&rq_MasterId=28177&rq_Revision=1">Link1</a>'

SELECT  '<a href="/ror/current/' + 
        dbo.RegexReplace('.*__TQinfoBaseImage.asp?.*rq_MasterId=(\d+).*', '$1',@YourLink,1,1)
    + '.image">' 
    + dbo.RegexReplace('<a\b[^>]*>(.*?)</ ?a>', '$1',@YourLink,1,1) 
    + '</a>'

/ * Замените @YourLink именем столбца данных, чтобы получить результаты и обновить * /

0 голосов
/ 09 марта 2012

Поскольку у меня возникли проблемы с ограничением размера вышеуказанного решения, я продолжаю поиск и обнаружил следующее:

http://www.codeproject.com/Articles/19502/A-T-SQL-Regular-Expression-Library-for-SQL-Server

Я использую SQL 2005/8, поэтому CLR работает длямне.Этот компонент делает быстро и именно то, что мне нужно.

Пример:

DECLARE @text varchar(max);
SET @text = '<img src="../../../_UpInclude/scriptEx/__TQinfoBaseImage.asp?rq_RecordId=1696&rq_MasterId=16196&rq_Revision=2" height="369" width="260" />
             <b>some text</b>
             <img src="../../../_UpInclude/scriptEx/__TQinfoBaseImage.asp?rq_RecordId=1696&rq_MasterId=1696&rq_Revision=2" height="369" width="260" />
             <p>some html</p>
             <img src="../../../_UpInclude/scriptEx/__TQinfoBaseImage.asp?rq_RecordId=1696&rq_MasterId=21696&rq_Revision=2" height="369" width="260" />'

SELECT dbo.ufn_RegExReplace(CAST(@text AS varchar(MAX))
                        , '[^"]*__TQinfoBaseImage.asp?.*rq_MasterId=(\d+)[^"]*'
                        , '/ror/current/$1.image'
                        , 1)

Таким образом, для всех, у кого есть одна и та же проблема, вы можете выбрать сейчас два решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...