好久没有写有关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. 汉语言处理工具pyhanlp的简繁转换

      繁简转换 HanLP几乎实现了所有我们需要的繁简转换方式,并且已经封装到了HanLP中,使得我们可以轻松的使用,而分词器中已经默认支持多种繁简格式或者混合.这里我们不再做过多描述. 说明: ·Ha ...

  2. JavaBasic_正则表达式

    就是符合一定规则的字符串 规则字符在java.util.regex.Pattern类中 字符转义\. 匹配.字符\* 匹配*字符\\ 匹配\字符\n 新行(换行)符 ('\u000A') \r 回车符 ...

  3. 学习笔记之Fluent Python

    Fluent Python by Luciano Ramalho https://learning.oreilly.com/library/view/fluent-python/97814919462 ...

  4. nginx配置分发Tomcat服务,负载均衡

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 项目中瓦片资源越来越多,如果提高瓦片的访问效率是一个需要解决的 ...

  5. WPF Chart

    https://quant.stackexchange.com/questions/7065/how-to-create-charts-in-wpf-finance-applications

  6. Emscripten 安装和使用

    OS: Windows 10 x64 I. install 0. pre install Python2.7 Node js Java 1. down git clone https://github ...

  7. python-web微信实现

    1.url from django.conf.urls import url from django.contrib import admin from web import views urlpat ...

  8. mysql数据库优化(四)-项目实战

    在flask项目中,防止随着时间的流逝,数据库数据越来越多,导致接口访问数据库速度变慢.所以自己填充数据进行测试及 mysql优化 1.插入数据: 通过脚本,使用多进程,每100次提交数据 impor ...

  9. ETL讲解(很详细!!!)

    ETL讲解(很详细!!!) ETL是将业务系统的数据经过抽取.清洗转换之后加载到数据仓库的过程,目的是将企业中的分散.零乱.标准不统一的数据整合到一起,为企业的决策提供分析依据. ETL是BI项目重要 ...

  10. gradle-4.1-all.zip离线包下载 极速 android studio2.3 3.0编译必备

    http://download.csdn.net/download/yongheng289/10039982 gradle-4.1-all.zip离线包下载 极速 android studio2.3 ...