SQL Server中执行正则表达式
总体方案:写function,再执行update语句。
一、查询函数
-- =============================================
-- Author: <liudong>
-- Create date: <2012/11/06>
-- Description: <sql正则表达式>
-- =============================================
CREATE FUNCTION Reg
(
@pattern varchar(2000),
@matchstring varchar(8000)
)
returns int
as
begin
declare @objRegexExp int
declare @strErrorMessage varchar(255)
declare @hr int,@match bit
exec @hr= sp_OACreate 'VBScript.RegExp', @objRegexExp out
if @hr = 0
exec @hr= sp_OASetProperty @objRegexExp, 'Pattern', @pattern
if @hr = 0
exec @hr= sp_OASetProperty @objRegexExp, 'IgnoreCase', 1
if @hr = 0
exec @hr= sp_OAMethod @objRegexExp, 'Test', @match OUT, @matchstring
if @hr <>0
begin
return null
end
exec sp_OADestroy @objRegexExp
return @match
end
函数结果返回 1 ,验证成功。
SQL Server 阻止了对组件 'Ole Automation Procedures' 的 过程'sys.sp_OACreate' 的访问
执行下面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
--查询配置信息
RECONFIGURE;
EXEC sp_configure;
SELECT * FROM Users WHERE dbo.Reg('^[a-zA-Z]+$',UserName)=1
CREATE FUNCTION dbo.regexReplace (
@source ntext,
--原字符串
@regexp VARCHAR (1000),
--正则表达式
@replace VARCHAR (1000),
--替换值
@globalReplace BIT = 1,
--是否是全局替换
@ignoreCase BIT = 0 --是否忽略大小写
) returnS VARCHAR (MAX) AS
BEGIN DECLARE @hr INTEGER
DECLARE @objRegExp INTEGER
DECLARE @result VARCHAR (5000) EXEC @hr = sp_OACreate 'VBScript.RegExp',
@objRegExp OUTPUT
IF @hr <> 0
BEGIN
EXEC @hr = sp_OADestroy @objRegExp RETURN NULL
END EXEC @hr = sp_OASetProperty @objRegExp,
'Pattern',
@regexp
IF @hr <> 0
BEGIN
EXEC @hr = sp_OADestroy @objRegExp RETURN NULL
END EXEC @hr = sp_OASetProperty @objRegExp,
'Global',
@globalReplace
IF @hr <> 0
BEGIN
EXEC @hr = sp_OADestroy @objRegExp RETURN NULL
END EXEC @hr = sp_OASetProperty @objRegExp,
'IgnoreCase',
@ignoreCase
IF @hr <> 0
BEGIN
EXEC @hr = sp_OADestroy @objRegExp RETURN NULL
END EXEC @hr = sp_OAMethod @objRegExp,
'Replace',
@result OUTPUT,
@source,
@replace
IF @hr <> 0
BEGIN
EXEC @hr = sp_OADestroy @objRegExp RETURN NULL
END EXEC @hr = sp_OADestroy @objRegExp
IF @hr <> 0
BEGIN
RETURN NULL
END RETURN @result
END
三、执行update
update Merchandise set Content=dbo.regexReplace(Content,'<img.*?>','',1,1) where dbo.Reg('<img.*?>',Content)=1;
【插播事故】哎呀误update了。一开始没加上where条件,执行完了才隐隐感觉不对劲,没去细想,就干别的事情了。结果,领导跑过来说其他小问题的时候,发现了大问题!就是Content全部变为null了!悲剧。我亲手酿制了一次质量事故。
于是从网上各种渠道搜索如何恢复数据,找到了几篇比较有意义的文章,但是因为我的恢复模式是简单的,不是完整的,所以没办法按文章所述的方法去恢复。但是还是要记录一下这些文章,给了我启迪。
关于数据库恢复的参考:
http://blog.csdn.net/dba_huangzj/article/details/8491327 http://www.cnblogs.com/dudu/archive/2011/10/15/sql_server_recover_deleted_records.html
最后找到三天前的备份,利用联合查询,恢复了部分数据,但是有部分数据因为没有事务日志,没有办法恢复了。
跨数据库联合查询更新的脚本,记录一下:
UPDATE a
SET a.[Content] = b.[Content]
from [目标库名].[dbo].[Merchandise] a
left join [来源库名].[dbo].[Merchandise] b on a.MerchandiseID=b.MerchandiseID
WHERE a.Content is null and a.editTime>'2015-08-01 00:00:00';
GO
关于SQL中的正则表达式参考:
http://www.2cto.com/database/201211/166792.html http://www.cnblogs.com/simadi/p/4288466.html http://tool.oschina.net/regex
SQL Server中执行正则表达式的更多相关文章
- SQL Server中执行Sql字符串,返回执行结果
今天遇到一个问题:想把sql字符串在SQL Server 中执行了,并获取执行的结果 ); SET @tablename='select @table3 = count(1) from UserVis ...
- SQL Server中使用正则表达式
SQL Server 2005及以上版本支持用CLR语言(C# .NET.VB.NET)编写过程.触发器和函数,因此使得正则匹配,数据提取能够在SQL中灵活运用,大大提高了SQL处理字符串,文本等内容 ...
- SQL Server 中执行Shell脚本计算本地文件的内容大小
SQL Server 数据库中除了能执行基本的SQL语句外,也可以执行Shell脚本.默认安装后,SQL中的Shell脚本的功能是关闭的,需要手动打开, 执行以下脚本即可打开该功能. -- 允许配置高 ...
- Sql Server中执行计划的缓存机制
Sql查询过程 当执行一个Sql语句或者存储过程时, Sql Server的大致过程是 1. 对查询语句进行分析,将其生成逻辑单元,并进行基本的语法检查 2. 生成查询树(会将查询语句中所有操作转换为 ...
- SQL Server中利用正则表达式替换字符串
--如果存在则删除原有函数 IF OBJECT_ID(N'dbo.RegexReplace') IS NOT NULL DROP FUNCTION dbo.RegexReplace G ...
- 在Sql Server 中使用正则表达式
CREATE FUNCTION dbo.find_regular_expression ( ), --需要匹配的源字符串 ), --正则表达式 --是否区分大小写,默认为false ) RETURNS ...
- 在64位SQL Server中创建Oracle的链接服务器
当我们同时使用SQL Server和Oracle来存储数据时,经常会用到跨库查询.为了方便使用跨库查询,一个最好的办法就是通过创建链接服务器来实现.既可以在SQL Server中创建Oracle的链接 ...
- 谈一谈SQL Server中的执行计划缓存(上)
简介 我们平时所写的SQL语句本质只是获取数据的逻辑,而不是获取数据的物理路径.当我们写的SQL语句传到SQL Server的时候,查询分析器会将语句依次进行解析(Parse).绑定(Bind).查询 ...
- sql server中如何查看执行效率不高的语句
sql server中,如果想知道有哪些语句是执行效率不高的,应该如何查看呢?下面就将为您介绍sql server中如何查看执行效率不高的语句,供您参考. 在测量功能时,先以下命令清除sql se ...
随机推荐
- go 切片练习
下列程序输出什么? package main import "fmt" func main() { var sa = make([]string, 5, 10) f ...
- kworker内核工作队列详解
工作队列是另一种将工作推后执行的形式,它可以把工作交给一个内核线程去执行,这个下半部是在进程上下文中执行的,因此,它可以重新调度还有睡眠. 区分使用软中断/tasklet还是工作队列比较简单,如 ...
- vue2.0组件之间的传值
1.父子组件--props props:需要注意的是,虽然的是单向的数据流,但是如果传递的是数组或是对象这样的引用类型,子组件数据变化,父组件的数据通也会变化 子组件代码 <template&g ...
- JAVA汉字转拼音(取首字母大写)
import net.sourceforge.pinyin4j.PinyinHelper;import net.sourceforge.pinyin4j.format.HanyuPinyinCaseT ...
- 金融数据分析 - 利用 Tushare Pro 平台 获取金融数据
Tushare金融大数据开放社区 免费提供各类金融数据和区块链数据 , 助力智能投资与创新型投资. 详见 https://tushare.pro/
- Python_oldboy_自动化运维之路(四)
本节内容 集合 字符编码与转码 函数语法及基本特性 函数参数与局部变量 返回值和嵌套函数 递归 匿名函数 高阶函数 1.集合 集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变 ...
- 洛谷P1841重要的城市
传送门啦 重要城市有三个性质如下: 1.重要城市能对其他两个不同城市的最短路径做出贡献 2.重要城市具有唯一性,如果两不同城市之间的最短路径有两种中间城市情况,那么这两个中间城市可以彼此代替,就都不能 ...
- 20155309南皓芯 实验2 Windows口令破解
在网络界,攻击事件发生的频率越来越高,其中相当多的都是由于网站密码泄露的缘故,或是人为因素导致,或是口令遭到破解,所以从某种角度而言,密码的安全问题不仅仅是技术上的问题,更主要的是人的安全意识问题. ...
- PHP性能调优---php-fpm - 启动参数及重要配置详解
约定几个目录/usr/local/php/sbin/php-fpm/usr/local/php/etc/php-fpm.conf/usr/local/php/etc/php.ini 一,php-fpm ...
- mysql 解除正在死锁的状态
转自:http://blog.csdn.net/hotdust/article/details/51524469 from: http://www.2cto.com/database/201303/1 ...