Sql Server 三个很有用的函数
好久没有写有关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 三个很有用的函数的更多相关文章
- 继承自NSObject的不常用又很有用的函数(2)
函数调用 Objective-C是一门动态语言,一个函数是由一个selector(SEL),和一个implement(IML)组成的.Selector相当于门牌号,而Implement才是真正的住户( ...
- SQL Server 中截取字符串常用的函数
SQL Server 中截取字符串常用的函数: 1.LEFT ( character_expression , integer_expression ) 函数说明:LEFT ( '源字符串' , '要 ...
- SQL Server中的LEFT、RIGHT函数
SQL Server中的LEFT.RIGHT函数. LEFT:返回字符串中从左边开始指定个数字符. LEFT(character_expression,integer_expression); RIG ...
- 转 一篇关于sql server 三种恢复模式的文章,从sql server 的机制上来写的,感觉很不错,转了
简介 SQL Server中的事务日志无疑是SQL Server中最重要的部分之一.因为SQL SERVER利用事务日志来确保持久性(Durability)和事务回滚(Rollback).从而还部分确 ...
- SQL Server 中几个有用的特殊函数
在SQL Server 的使用过程中,发现几个很有用,但不太常用(或细节不太清楚)的函数(存储过程): isnumeric,isdate,patindex,newid,collate,sp_execu ...
- SQL Server 中的窗口函数(2012 新函数)
简介 SQL Server 2012之后对窗口函数进行了极大的加强,但对于很多开发人员来说,对窗口函数却不甚了解,导致了这样强大的功能被浪费,因此本篇文章主要谈一谈SQL Server中窗口函数的概念 ...
- 在SQL SERVER中实现RSA加解密函数(第一版)
/*************************************************** 作者:herowang(让你望见影子的墙) 日期:2010.1.1 注: 转载请保留此信息 ...
- SQL Server三种表连接原理
在SQL Server数据库中,查询优化器在处理表连接时,通常会使用一下三种连接方式: 嵌套循环连接(Nested Loop Join) 合并连接 (Merge Join) Hash连接 (Hash ...
- SQL Server高级内容之case语法函数
1.Case函数的用法 (1)使用类似:switch-case与if-else if. (2)语法: case [字段] when 表达式 then 显示数据 when 表达式 then 显示数据 ...
随机推荐
- bootstrap 模态框事件
事件 描述 实例 show.bs.modal 在调用 show 方法后触发. $('#identifier').on('show.bs.modal', function () { // 执行一些动作. ...
- 【python】变量的赋值、深浅拷贝
python——赋值与深浅拷贝 https://www.cnblogs.com/Eva-J/p/5534037.html 啥都不说,看这个博主的文章!
- zabbix官网不能访问的问题
zabbix 3.4官方文档 https://www.zabbix.com/documentation/3.4/zh/start zabbix官网不能访问 一开始以为运营商限制就切换运营商发现 电信可 ...
- solidworks建立三维模型里面的几何对象和工程图里面的元素的联系
本文是帮助里面的一个例子, 首先打开一个三维模型和对应的工程图,保持三维模型为当前激活窗口,在三维模型里面选中一个面或者一个边,然后运行下面的代码, 会将工程图里面的第一视图里面对应的投影元素的线型的 ...
- maven仓库配置阿里云镜像
maven仓库的默认镜像为国外镜像,下载jar包依赖非常慢,可以将镜像设置为国内的阿里云. 只需要在maven的conf的setting中配置如下: <mirrors> <mirro ...
- Chapter4 复杂度分析(下):浅析最好,最坏,平均,均摊时间复杂度
四个复杂度分析: 1:最好情况时间复杂度(best case time complexity) 2:最坏情况时间复杂度(worst case time complexity) 3:平均情况时间复杂度( ...
- redis消息通知(任务队列/优先级队列/发布订阅模式)
1.任务队列 对于发送邮件或者是复杂计算这样的操作,常常需要比较长的时间,为了不影响web应用的正常使用,避免页面显示被阻塞,常常会将此类任务存入任务队列交由专门的进程去处理. 队列最基础的方法如下: ...
- suricata HTTP关键字
http request http request请求包括请求行.请求头.空行和内容.一个普通的request请求如下: http response http response应答包括应答行,头部,空 ...
- Redis 主从集群搭建及哨兵模式配置
最近搭建了redis集群及哨兵模式,为方便以后查看特此记录下来: 1.Redis安装 2.主从架构 2.1 Redis主从架构图 2.2Redis主从结构搭建 Redis集群不用安装多个Redis,只 ...
- JS截取URL地址参数
var url = window.location.search; 截取?r= 后面的参数var url = window.location.href;var urlss= urlssplit('co ...