2012-03-08 123 views
1

我正在處理一些我想用來將內容數據更新到新軟件版本的修補程序更新語句。 因此,我有一個版本X的數據庫,並希望將內容更新到版本Y.使用SQL UPDATE替換HTML內容

在數據庫中我有包含HTML內容的字段(:type text或varchar)的表。

有一個超鏈接,我需要更新到一種新的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> 

所以,我需要找到一個鏈接(不區分大小寫),搶ID和新的鏈接替換它們。 所以我正在尋找一個「正則表達式」的替代品,但到目前爲止我還沒有找到任何有關它的信息。

喜歡的東西:

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

有誰知道如何待辦事項嗎?提前致謝!

回答

1

這給出了你所需要的。首先創建功能。我正在使用您的數據作爲示例。

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

當我更改@主題和@代替varchar(MAX)它不再工作。來自源鏈接的版本我也試過,並且根本不工作。任何想法?目前它將我的內容限制爲4000個字符,但我的內容有更多的字符。如果我在內容中有更多的鏈接,會發生什麼情況?它是否會取代兩者? – YvesR 2012-03-09 08:12:40

+1

您可以製作'@Subject VARCHAR(max)'和'RETURN VARCHAR(max)'。如果你能找到正確的正則表達式函數將替換多個鏈接。例如'SELECT dbo.RegexReplace('] *>','',@ YourLink,1,1)'但是這不能找到您正在搜索的組模式。只查找錨的第一部分' Kaf 2012-03-09 10:16:10

0

正如我曾與上述解決辦法,我繼續搜索的大小限制的問題,並發現這一點:

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) 

因此,對於所有有同樣的問題,你現在可以選擇兩種解決方案。