好久没有写有关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. Vue的理解:Vue.js新手入门指南----转

    最近在逛各大网站,论坛,以及像SegmentFault等编程问答社区,发现Vue.js异常火爆,重复性的提问和内容也很多,楼主自己也趁着这个大前端的热潮,着手学习了一段时间的Vue.js,目前用它正在 ...

  2. Spark Streaming 'numRecords must not be negative'问题解决

    转载自:http://blog.csdn.net/xueba207/article/details/51135423 问题描述 笔者使用spark streaming读取Kakfa中的数据,做进一步处 ...

  3. 全面理解Java内存模型(JMM)及volatile关键字

    [版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/72772461 出自[zejian ...

  4. Flask--(项目准备)--框架搭建,参数配置

    项目准备: 配置参数 项目配置: 新建工程: 配置虚拟环境: 通过配置类添加配置参数: Debug配置, 初始化数据库对象, Mysql配置及数据库创建 redis配置: 端口6379和域名: 创建存 ...

  5. Code::Blocks 导入Makefile工程

    1)“File -> New -> Project”,选择“Empty Project”并创建. 2)选中 Project,右键,选择“Add files”,将 c/c++ 和 head ...

  6. PAT 甲级 1083 List Grades (25 分)

    1083 List Grades (25 分) Given a list of N student records with name, ID and grade. You are supposed ...

  7. 第二次作业——分布式版本控制系统Git的安装与使用

    作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2097 远程仓库地址是:https://github.com/sheep ...

  8. 并发之lock的condition接口

    13.死磕Java并发-----J.U.C之Condition 12.Condition使用总结 11.Java并发编程系列之十七:Condition接口 === 13.死磕Java并发-----J. ...

  9. DllImport使用

    1.Dll引用路径 (1)exe运行程序所在的目录 (2)System32目录 (3)环境变量目录 (4)自定义路径,如:DllImport(@"C:\OJ\Bin\Judge.dll&qu ...

  10. 10K+,深度学习论文、代码最全汇总!

    我们大部分人是如何查询和搜集深度学习相关论文的?绝大多数情况是根据关键字在谷歌.百度搜索.想寻找相关论文的复现代码又会去 GitHub 上搜索关键词.浪费了很多时间不说,论文.代码通常也不够完整.怎么 ...