好久没有写有关SqlServer 数据库方面技术的文章了,正好今天遇到了一个问题,我就把这个当做一个练习记录下来。今天遇到一个麻烦事,详情如下:公司买了一个系统,在这个系统里面有一个“充值卡”的功能,但是充值卡的当前所剩下的金额已经被乱码了,看不出来真正的金额,而且,卖软件的那家公司把所有的Sql 函数和存储过程都加密了,没有办法看到。

  怎么办?为了和公司的其他系统进行集成,于是,我就试试来写一个逆运算来还原当前“充值卡”的剩余金额,搞了一天终于搞出来了。其实这个东西不是很难,只是刚开始的时候什么也不知道,东找西找,做测试,浪费了很多时间。解决了就好,现在有时间,我就把两个函数的实现代码都贴出来,大家一看,原来如此。然后有时间,在贴一下第三个函数,去掉带有小数后面多余0的一个函数的实现,都很有用,大家可以保留,没准什么时候就能用到。

  1、我们先看看获取“充值卡”原始值得Sql Server的函数吧,代码如下:

     -- =============================================
-- Author: <PatrickLiu>
-- Create date: <2018-11-20 18:21>
-- Description: <根据乱码的数据获取原始的数据>
-- =============================================
ALTER FUNCTION [dbo].[fun_GetResidualAmount]
(
@GarbledValue as varchar(40)
)
RETURNS decimal(16,4)
AS
BEGIN
IF(@GarbledValue is null or @GarbledValue='' or @GarbledValue = '0.00')
BEGIN
RETURN 0.00;
END DECLARE @TempValue varchar(40);
DECLARE @Length int;
DECLARE @Index int;
DECLARE @CurrentMoney decimal(16,4) SET @TempValue='';
SET @Index=1;
SET @Length = len(@GarbledValue) WHILE @Index<=@Length
BEGIN
SET @TempValue = @TempValue + '' + char(ASCII(SUBSTRING(@GarbledValue,@Index,1))-((@Length-@Index-2) * 2)) SET @Index = @Index + 1;
END SET @TempValue = REVERSE(@TempValue) --字符串反转
IF(ISNUMERIC(@TempValue)=1)
SET @CurrentMoney = CAST(@TempValue as decimal(16,4)) / 10000 --转数字
ELSE
SET @CurrentMoney = 0 RETURN @CurrentMoney
END

  2、这个函数算是生成乱码结果值的函数,功能很简单,这个就是我费力写出来的。

     -- =============================================
-- Author: <PatrickLiu>
-- Create date: <2018-11-20 10:32>
-- Description: <根据原始的数据生成乱码的数据>
-- =============================================
ALTER FUNCTION [dbo].[fun_GetGarbledValue]
(
@OriginalValue as decimal(16,4)
)
RETURNS varchar(40)
AS
BEGIN
IF(@OriginalValue is null or @OriginalValue=0)
BEGIN
return '';
END declare @GarbledValue varchar(40);
declare @length int;
declare @index int;
declare @OriginalValueCopy decimal(16,4);
declare @OriginalValueCopy2 varchar(40); set @GarbledValue='';
set @OriginalValueCopy2='';
set @index=1;
set @OriginalValueCopy =@OriginalValue*10000;
set @OriginalValueCopy2 = REVERSE(@OriginalValueCopy);
set @OriginalValueCopy2=''+SUBSTring(@OriginalValueCopy2,CHARINDEX('.',@OriginalValueCopy2),100);
set @length = len(@OriginalValueCopy2); WHILE @index<=@length
begin
set @GarbledValue = @GarbledValue + '' + char(ASCII(SUBSTRING(@OriginalValueCopy2,@index,1))+((@length - @index - 2) * 2));
set @index = @index + 1;
end
return @GarbledValue
END

  3、这是第三个有用的函数,我也拿出来,给大家分享

     -- =============================================
-- Author: <PatrickLiu>
-- Create date: <2018-11-20 17:57>
-- Description: <去掉小数点后面多余的0>
-- =============================================
CREATE FUNCTION [dbo].[fun_ClearNumberPointZero](@NumberValue varchar(50))
RETURNS VARCHAR(50)
AS
BEGIN
DECLARE @returnValue varchar(20); IF(@NumberValue='')
BEGIN
SET @returnValue='' --空的时候为空
END
ELSE IF(CHARINDEX('.',@NumberValue) ='')
BEGIN
SET @returnValue=@NumberValue --针对不含小数点的
END
ELSE IF ( SUBSTRING(REVERSE(@NumberValue),PATINDEX('%[^0]%',REVERSE(@NumberValue)),1)='.')
BEGIN
SET @returnValue =left(@NumberValue,LEN(@NumberValue)-PATINDEX('%[^0]%',REVERSE(@NumberValue))) --针对小数点后全是0的
END
ELSE
BEGIN
SET @returnValue =left(@NumberValue,LEN(@NumberValue)- PATINDEX('%[^0]%.%',REVERSE(@NumberValue))+1) --其他任何情形
END
RETURN @returnValue
END

   好了,就到这里了。对于程序员来说,解决问题是最幸福的,继续努力,每天进步一点点。

Sql Server 三个很有用的函数的更多相关文章

  1. 继承自NSObject的不常用又很有用的函数(2)

    函数调用 Objective-C是一门动态语言,一个函数是由一个selector(SEL),和一个implement(IML)组成的.Selector相当于门牌号,而Implement才是真正的住户( ...

  2. SQL Server 中截取字符串常用的函数

    SQL Server 中截取字符串常用的函数: 1.LEFT ( character_expression , integer_expression ) 函数说明:LEFT ( '源字符串' , '要 ...

  3. SQL Server中的LEFT、RIGHT函数

    SQL Server中的LEFT.RIGHT函数. LEFT:返回字符串中从左边开始指定个数字符. LEFT(character_expression,integer_expression); RIG ...

  4. 转 一篇关于sql server 三种恢复模式的文章,从sql server 的机制上来写的,感觉很不错,转了

    简介 SQL Server中的事务日志无疑是SQL Server中最重要的部分之一.因为SQL SERVER利用事务日志来确保持久性(Durability)和事务回滚(Rollback).从而还部分确 ...

  5. SQL Server 中几个有用的特殊函数

    在SQL Server 的使用过程中,发现几个很有用,但不太常用(或细节不太清楚)的函数(存储过程): isnumeric,isdate,patindex,newid,collate,sp_execu ...

  6. SQL Server 中的窗口函数(2012 新函数)

    简介 SQL Server 2012之后对窗口函数进行了极大的加强,但对于很多开发人员来说,对窗口函数却不甚了解,导致了这样强大的功能被浪费,因此本篇文章主要谈一谈SQL Server中窗口函数的概念 ...

  7. 在SQL SERVER中实现RSA加解密函数(第一版)

    /*************************************************** 作者:herowang(让你望见影子的墙) 日期:2010.1.1 注:   转载请保留此信息 ...

  8. SQL Server三种表连接原理

    在SQL Server数据库中,查询优化器在处理表连接时,通常会使用一下三种连接方式: 嵌套循环连接(Nested Loop Join) 合并连接 (Merge Join) Hash连接 (Hash ...

  9. SQL Server高级内容之case语法函数

    1.Case函数的用法  (1)使用类似:switch-case与if-else if. (2)语法: case [字段] when 表达式 then 显示数据 when 表达式 then 显示数据 ...

随机推荐

  1. Java12配置

    配置环境变量: 之前的JAVA_HOME和CLASSPATH已经都不要了.只要配置jdk的bin到Path里: C:\Program Files\Java\jdk-12\bin

  2. G2 绘制混合图例 demo

    G2 绘制混合图例 demo import G2 from '@antv/g2'; import DataSet from '@antv/data-set'; // G2 对数据源格式的要求,仅仅是 ...

  3. 一键精简Windows不常用的字体.cmd

    一键精简Windows不常用的字体.cmd @Echo offset path=%path%;%~dp0setlocal EnableDelayedExpansionset /P dv=请输入要精简W ...

  4. git 更新远程分支列表

    git remote update origin --prune git remote update origin -p

  5. 数据恢复工具--extundelete的安装与使用

    1.extundelete的恢复原理 extundelete恢复文件时并不依赖特定文件格式,首先extundelete会通过文件系统的inode信息,来获得当前文件系统下所有文件的信息,包括存在的和已 ...

  6. 使用 tag 文件定义自定义标签

    ----------------------------------------------------------------------- 在jsp文件中,可以引用tag和tld文件. 1.对于t ...

  7. 个人测试SQL学习

    --普通方法赋值 declare @a int print @a --Update 方法赋值 ) ' print @name --Select 语句赋值 ) ' print @name ) selec ...

  8. gogs 源码阅读笔记 001

    gogs 源码阅读笔记 001 gogs项目相当不错,本笔记实际是基于gogs fork版本 git-122a66f. gitea (gitea版本由来)[https://blog.gitea.io/ ...

  9. C语言中的作用域,链接属性和存储类型

    作用域 当变量在程序的某个部分被声明的时候,他只有在程序的一定渔区才能被访问,编译器可以确认4种不同类型的作用域:文件作用域,函数作用域,代码块作用域和原型作用域 1.代码块作用域:位于一对花括号之间 ...

  10. linux 配置vue环境

    系统 [root@Gao conf.d]# uname -a 工具 1.Final Shell 2.工具截图 需要下载的部分 node.js    npm   cnpm   vue-cli 安装nod ...