2012-03-08 3 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') 

どのようにこのTODO誰もが知っていますか?前もって感謝します!

答えて

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>' 

/*データCOL結果を得るために名前とアップデートにより@YourLink交換してください*/

+0

私は@ subjectを変更し、@ varchar(MAX)に代入するともう動作しません。ソースリンクのバージョンも試してみましたが、全く動作しません。何か案が?現時点では、私のコンテンツは4000文字に制限されていますが、私のコンテンツはより多くの文字を持っています。コンテンツ内に複数のリンクがある場合はどうなりますか、それは両方を置き換えますか? – YvesR

+1

'@Subject VARCHAR(max)'と 'RETURN VARCHAR(max)'を作ることができます。あなたが正しい正規表現を見つけることができれば、funtionは複数のリンクを置き換えます。たとえば 'SELECT dbo.RegexReplace(' *> '、' '、@ YourLink、1,1)'これはできません。あなたが探しているグループパターンを見つけてください。最初の部分 'のアンカーのみを探します – Kaf

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) 

、あなたは今、2つのソリューションを選択することができます。

関連する問題