设为首页 收藏本站
查看: 918|回复: 0

[经验分享] sql正则表达式

[复制链接]

尚未签到

发表于 2016-11-12 00:01:50 | 显示全部楼层 |阅读模式
  IF OBJECT_ID(N'dbo.RegexFind') IS NOT NULL 
  DROP FUNCTION dbo.RegexFind
  GO
  create function RegexFind(
  @pattern VARCHAR(255),
  @matchstring VARCHAR(8000),
  @global BIT = 1,
  @Multiline bit =1)
  returns
  @result TABLE
  (
  Match_ID INT,
  FirstIndex INT ,
  length INT ,
  Value VARCHAR(2000),
  Submatch_ID INT,
  SubmatchValue VARCHAR(2000),
  Error Varchar(255)
  )
  AS -- columns returned by the function
  begin
  DECLARE @objRegexExp INT,
  @objErrorObject INT,
  @objMatch INT,
  @objSubMatches INT,
  @strErrorMessage VARCHAR(255),
  @error varchar(255),
  @Substituted VARCHAR(8000),
  @hr INT,
  @matchcount INT,
  @SubmatchCount INT,
  @ii INT,
  @jj INT,
  @FirstIndex INT,
  @length INT,
  @Value VARCHAR(2000),
  @SubmatchValue VARCHAR(2000),
  @objSubmatchValue INT,
  @command VARCHAR(8000),
  @Match_ID INT
  DECLARE @match TABLE
  (
  Match_ID INT IDENTITY(1, 1)NOT NULL,
  FirstIndex INT NOT NULL,
  length INT NOT NULL,
  Value VARCHAR(2000)
  )    
  DECLARE @Submatch TABLE
  (
  Submatch_ID INT IDENTITY(1, 1),
  match_ID INT NOT NULL,
  SubmatchNo INT NOT NULL,
  SubmatchValue VARCHAR(2000)
  )
  set  @strErrorMessage = 'creating a regex object';
  set @error='';
  EXEC @hr= sp_OACreate 'VBScript.RegExp', @objRegexExp OUT
  IF @hr = 0 
  set  @strErrorMessage = 'Setting the Regex pattern';
  set @objErrorObject = @objRegexExp
  IF @hr = 0 
  EXEC @hr= sp_OASetProperty @objRegexExp, 'Pattern', @pattern
  IF @hr = 0 
  set  @strErrorMessage = 'Specifying a case-insensitive match' 
  IF @hr = 0 
  EXEC @hr= sp_OASetProperty @objRegexExp, 'IgnoreCase', 1
  IF @hr = 0 
  EXEC @hr= sp_OASetProperty @objRegexExp, 'MultiLine', @Multiline
  IF @hr = 0 
  EXEC @hr= sp_OASetProperty @objRegexExp, 'Global', @global
  IF @hr = 0 
  set  @strErrorMessage = 'Doing a match' 
  IF @hr = 0 
  EXEC @hr= sp_OAMethod @objRegexExp, 'execute', @objMatch OUT,
  @matchstring
  IF @hr = 0 
  set  @strErrorMessage = 'Getting the number of matches'     
  IF @hr = 0 
  EXEC @hr= sp_OAGetProperty @objmatch, 'count', @matchcount OUT
  set  @ii = 0;
  WHILE @hr = 0 AND @ii < @Matchcount
  BEGIN
  --The Match object has four read-only properties. 
  --The FirstIndex property indicates the number of characters in the string to the left of the match. 
  --The Length property of the Match object indicates the number of characters in the match. 
  --The Value property returns the text that was matched.
  set  @strErrorMessage = 'Getting the FirstIndex property';
  set    @command = 'item(' + CAST(@ii AS VARCHAR) + ').FirstIndex'    
  IF @hr = 0 
  EXEC @hr= sp_OAGetProperty @objmatch, @command,
  @Firstindex OUT
  IF @hr = 0 
  set  @strErrorMessage = 'Getting the length property';
  set  @command = 'item(' + CAST(@ii AS VARCHAR) + ').Length';  
  IF @hr = 0 
  EXEC @hr= sp_OAGetProperty @objmatch, @command, @Length OUT
  IF @hr = 0 
  set  @strErrorMessage = 'Getting the value property';
  set  @command = 'item(' + CAST(@ii AS VARCHAR) + ').Value';
  IF @hr = 0 
  EXEC @hr= sp_OAGetProperty @objmatch, @command, @Value OUT
  INSERT  INTO @match(Firstindex,Length,Value)
  values(@firstindex + 1,@Length, @Value);
  set  @Match_ID = @@Identity;
  --The SubMatches property of the Match object is a collection of strings. 
  --It will only hold values if your regular expression has capturing groups. 
  --The collection will hold one string for each capturing group. 
  --The Count property indicates the number of string in the collection. 
  --The Item property takes an index parameter, and returns the text matched by the capturing group. 
  --The Item property is the default member, so you can write SubMatches(7) as a shorthand to SubMatches.Item(7). 
  --Unfortunately, VBScript does not offer a way to retrieve the match position and length of capturing groups.
  IF @hr = 0 
  set  @strErrorMessage = 'Getting the SubMatches collection';
  set  @command = 'item(' + CAST(@ii AS VARCHAR) + ').SubMatches';
  IF @hr = 0 
  EXEC @hr= sp_OAGetProperty @objmatch, @command,@objSubmatches OUT
  IF @hr = 0 
  set  @strErrorMessage = 'Getting the number of submatches'     
  IF @hr = 0 
  EXEC @hr= sp_OAGetProperty @objSubmatches, 'count', @submatchCount OUT
  set  @jj = 0 
  WHILE @hr = 0
  AND @jj < @submatchCount
  BEGIN
  IF @hr = 0 
  set  @strErrorMessage = 'Getting the submatch value property';
  set  @command = 'item(' + CAST(@jj AS VARCHAR) + ')';
  set @submatchValue=null; 
  IF @hr = 0 
  EXEC @hr= sp_OAGetProperty @objSubmatches, @command, @SubmatchValue OUT
  INSERT  INTO @Submatch( Match_ID,SubmatchNo,SubmatchValue)
  values(@Match_ID,@jj+1,@SubmatchValue);
  set  @jj = @jj + 1
  END
  set  @ii = @ii + 1
  END
  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
  set  @Error = 'Error whilst '
  + COALESCE(@strErrorMessage, 'doing something') + ', '
  + COALESCE(@Description, '')
  END
  EXEC sp_OADestroy @objRegexExp
  EXEC sp_OADestroy @objMatch
  EXEC sp_OADestroy  @objSubMatches
  insert into @result
  (Match_ID,
  FirstIndex,
  [length],
  [Value],
  Submatch_ID,
  SubmatchValue,
  error)
  SELECT  m.[Match_ID],[FirstIndex],[length],[Value],[SubmatchNo],[SubmatchValue],@error
  FROM @match m
  LEFT OUTER JOIN   @submatchs
  ON m.match_ID=s.match_ID;
  if @@rowcount=0 and len(@error)>0
  insert into @result(error) select @error
  return 
  end
  GO
QL Server 阻止了对组件 'Ole Automation Procedures' 的 过程'sys.sp_OACreate' 的访问
执行下面sql语句即可:
 
[sql] 
USE master    
GO    
sp_configure 'show advanced options', 1;    
GO    
RECONFIGURE;    
GO    
sp_configure 'Ole Automation Procedures', 1;    
GO    
RECONFIGURE;    
GO    
sp_configure 'Ad Hoc Distributed Queries', 1;    
GO    
RECONFIGURE;    
GO    

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-298889-1-1.html 上篇帖子: 经典SQL语句(转) 下篇帖子: 常用SQL注入代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表