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 显示数据 ...
随机推荐
- Django学习笔记之数据库-QuerySet_API
QuerySet API 我们通常做查询操作的时候,都是通过模型名字.objects的方式进行操作.其实模型名字.objects是一个django.db.models.manager.Manager对 ...
- c#中枚举类型 显示中文
public enum AuditEnum { [Description("未送审")] Holding=0, [Description("审核中")] Aud ...
- sublime text 3 vue 语法高亮
1.下载文件 链接 https://github.com/vuejs/vue-syntax-highlight 2.sublime菜单栏->Preferences->Browse Pack ...
- getattribute
属性访问拦截器 class Itcast(object): def __init__(self,subject1): self.subject1 = subject1 self.subject2 = ...
- 基础 - 字符读取函数scanf、getchar、gets、cin(清空缓存区解决单字符回车问题)
0x01 scanf.getchar.cin读取单字符: 如下: //scanf读取字符 回车问题 void Sub_1_1() { char v1,v2; scanf("%c", ...
- linux服务nfs与dhcp篇
nfs复习: 1.简介:用于liunx与linux之间的文件传输系统 2.下载nfs-utils和rpcbind 3.打开配置文件/etc/exports——文件名(目录名)共享给予的ip地址(rw) ...
- kettle大数据量读写mysql性能优化
修改kettleDB连接设置 1. 增加批量写的速度:useServerPrepStmts=false rewriteBatchedStatements=true useCompressio ...
- Windows下文件加固
今天学到一种Windows下简单的文件加固方法,可以防止文件被(普通)删除. CMD找到要加固的文件. 例:C盘下有个 1516.txt 文本文件需要加固. 然后 copy 该文件.(注意:这里并非普 ...
- python3中的urllib.parse的常用方法
将URL按一定的格式进行拆分 使用 urllib.parse.urlparse将url分为6个部分,返回一个包含6个字符串项目的元组:协议.位置.路径.参数.查询.片段 参照官方地址:https:// ...
- Oracle不能并行直接添加主键的方法:先建唯一索引后建主键
环境:Oracle 11.2.0.3 需求:生产一张表由于前期设计不当,没有主键.现需要添加主键,数据量很大,想并行建立. 1.直接添加,提示ora-3001:未实施的功能;只能单线程建立主键 SQL ...