MSSQL教程之用自界说函数交换SQL中的全角数字为半角...
上面我们说了DML的闪回方案。但对于DDL却无能为力,对于大多数的DDL,即使是rowbase格式,二进制日志binlog中仍只记录语句本身。对于删表操作,只记录一个语句droptablet。仅凭这句话,无法还原表的数据。函数在我们利用MSSQL的时分,偶然表中有一些是全角的数字,但我们的体系不克不及够准确的利用它们,这时候我们要把他们交换为半角数字。而SQL本人仿佛没有这个函数。
没有,我们本人下手:
上面就是我本人写的一个函数,固然,我的数据量小,没有思索功能!
--把全角数据转换成半角数字(注重,这个只能转换满是全角的,在第一个半角数据时前往)--公司:石家庄创联科技--编写:牛昆亮QQ:273352165
createfunctionufn_convertWideNumericToAnsi(@vstrInvarchar(1000))returnsvarchar(4000)asbegindeclare@strReturnvarchar(4000),@binvarbinary(4000),@strvarchar(4000),@stmpvarchar(4),@iint,@lenint--,@vstrInvarchar(1000)
--set@vstrIn=031851001845set@strReturn=set@bin=convert(varbinary(4000),@vstrIn)execmaster..xp_varbintohexstr@bin,@stroutselect@str=stuff(@str,1,2,)set@len=len(@str)set@i=1while@i<@lenbeginset@stmp=substring(@str,@i,4)if(substring(@stmp,1,1)A)return@vstrInset@stmp=replace(@stmp,A,)set@stmp=replace(@stmp,B,)--print@stmpset@stmp=cast((convert(int,@stmp)-30)asvarchar(1))set@strReturn=@strReturn+@stmpset@i=@i+4end--print@strReturnreturn@strReturnend
示例
select031851001845asORG,dbo.ufn_convertWideNumericToAnsi(031851001845)DES
ORGDES---------------------------------------------------031851001845031851001845
有了数据以后,我们就要想一个比较统一的方法来闪回。上面我们说了对于DML操作,可以通过反向执行所有逆操作来实现,对于语句里面的DDL,只能直接跳过。原因是一个DDL不一定有直接的逆操作。 如安全管理、备份恢复、性能监控和调优等,SQL只要熟悉基本操作就可以,只要程序设计部分只要稍加了解即可(如存储过程、触发器等)。 对一张百万级别的表建游标,同时又没有什么过滤条件,取得游标效率是如果直接SQL查询百万条数据;如果再对每条记录做处理,耗时将更长。 可以动态传入参数,省却了动态SQL的拼写。 数据库物理框架没有变动undo和redo都放在数据库得transaction中,个人感觉是个败笔。如果说我们在设计数据库的时候考虑分多个数据库,可能能在一定程度上避免I/O效率问题。 一直以来个人感觉SQLServer的优化器要比Oracle的聪明。SQL2005的更是比2k聪明了不少。(有次作试验发现有的语句在200万级时还比50万级的相同语句要快show_text的一些提示没有找到解释。一直在奇怪。) 记得在最开始使用2k的时候就要用到这个功能,可惜2k没有,现在有了作解决方案的朋友会很高兴吧。 你可以简单地认为适合的就是好,不适合就是不好。 但换公司用MSSQL2K感觉自己好像根本就不了解MSSQL。什么DTS触发器以前根本没用过。
页:
[1]