我正在处理一些修补程序更新语句,我想将其用于将内容数据更新为新的软件版本。 所以我有一个X版数据库,想要将内容更新为Y版。
在数据库内部,我有包含字段(:type text或varchar)的表,包括HTML内容。
我需要更新到一种新的网址。
示例:
<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')
任何人都知道怎么回事?提前谢谢!
答案 0 :(得分: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替换为数据列名以获取结果并更新* /
答案 1 :(得分: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)
因此,对于所有具有相同问题的人,您现在可以选择两种解决方案。