SQL Server获取下一个编码字符实现
周末看到SQL Server 大V潇湘隐者的获取下一个编码字符串问题,本来作为以上博文的回复,也许回复内容长度超过其允许限制,无法提交。鉴于此,特记录SQL Server实现过程,方便自己回顾和查阅。
IF OBJECT_ID(N'dbo.ufn_GetCodeChars', 'TF') IS NOT NULL
BEGIN
DROP FUNCTION dbo.ufn_GetCodeChars;
END
GO --==================================
-- 功能: 获取编码字符表函数
-- 说明: 编码字符只包含0-9和A-Z这两类字符
-- 将以上字符映射到对应十进制数值。
-- 作者: XXX
-- 创建: yyyy-MM-dd
-- 修改: yyyy-MM-dd XXX 修改内容描述
-- 调用: SELECT CodeChar, CodeValue FROM dbo.ufn_GetCodeChars();
--==================================
CREATE FUNCTION dbo.ufn_GetCodeChars
(
) RETURNS @tblCodeChars TABLE (
CodeChar CHAR() NOT NULL,
CodeValue TINYINT NOT NULL
)
--$Encode$--
AS
BEGIN
DECLARE
@intStartIndexID AS TINYINT,
@intEndIndexID AS TINYINT; SELECT
@intStartIndexID = ,
@intEndIndexID = ; -- 初始化0-9数字字符
SELECT
@intStartIndexID = ASCII(''),
@intEndIndexID = ASCII('');
WHILE @intStartIndexID <= @intEndIndexID
BEGIN
INSERT INTO @tblCodeChars (CodeChar, CodeValue)
VALUES (CHAR(@intStartIndexID), ); SET @intStartIndexID = @intStartIndexID + ;
END -- 初始化A-Z字母字符
SELECT
@intStartIndexID = ASCII('A'),
@intEndIndexID = ASCII('Z');
WHILE @intStartIndexID <= @intEndIndexID
BEGIN
INSERT INTO @tblCodeChars (CodeChar, CodeValue)
VALUES (CHAR(@intStartIndexID), ); SET @intStartIndexID = @intStartIndexID + ;
END -- 修改每个编码字符对应的编码值
;WITH tCodeData AS (
SELECT CodeChar, ROW_NUMBER() OVER (ORDER BY CodeChar ASC) AS RowNum
FROM @tblCodeChars
) UPDATE T2
SET T2.CodeValue = T.RowNum -
FROM tCodeData AS T
INNER JOIN @tblCodeChars AS T2
ON T.CodeChar = T2.CodeChar; RETURN;
END
GO
IF OBJECT_ID(N'dbo.ufn_GetCodeCharFixLength', 'FN') IS NOT NULL
BEGIN
DROP FUNCTION dbo.ufn_GetCodeCharFixLength;
END
GO --==================================
-- 功能: 获取编码字符组合的固定长度
-- 说明: 如果转化为int数据类,只能是8位整数,且字符串编码的固定长度只能是8,仅支持5到8位编码字符的组合
-- 作者: XXX
-- 创建: yyyy-MM-dd
-- 修改: yyyy-MM-dd XXX 修改内容描述
-- 调用: SELECT dbo.ufn_GetCodeCharFixLength();
--==================================
CREATE FUNCTION ufn_GetCodeCharFixLength
(
) RETURNS TINYINT
--$Encode$--
AS
BEGIN
RETURN CAST( AS TINYINT);
END
GO
转换编码字符为整数数值的标量函数
IF OBJECT_ID(N'dbo.ufn_GetCodeIntegerValue', 'FN') IS NOT NULL
BEGIN
DROP FUNCTION dbo.ufn_GetCodeIntegerValue;
END
GO --==================================
-- 功能: 通过编码字符获取其对应的整数数值
-- 说明: 具体实现阐述
-- 作者: XXX
-- 创建: yyyy-MM-dd
-- 修改: yyyy-MM-dd XXX 修改内容描述
-- 调用: SELECT dbo.ufn_GetCodeIntegerValue('A0000')
--==================================
CREATE FUNCTION dbo.ufn_GetCodeIntegerValue
(
@chCodeChar CHAR() ) RETURNS INT
--$Encode$--
AS
BEGIN
SET @chCodeChar = ISNULL(@chCodeChar, '');
SET @chCodeChar = UPPER(@chCodeChar);
DECLARE @intCodeIntegerValue AS INT;
SET @intCodeIntegerValue = ; DECLARE @tintFixLength AS TINYINT;
SET @tintFixLength =dbo.ufn_GetCodeCharFixLength(); DECLARE @tintLength AS TINYINT;
SET @tintLength = LEN(@chCodeChar); IF @tintLength <= (@tintFixLength - ) OR @tintLength >= (@tintFixLength + )
BEGIN
RETURN @intCodeIntegerValue;
END DECLARE @tblCodeChars TABLE(
CodeChar CHAR() NOT NULL,
CodeValue TINYINT NOT NULL
); INSERT INTO @tblCodeChars (CodeChar, CodeValue)
SELECT CodeChar, CodeValue
FROM dbo.ufn_GetCodeChars(); WHILE @tintLength >=
BEGIN
SELECT @intCodeIntegerValue = @intCodeIntegerValue + CodeValue * POWER(, @tintFixLength - @tintLength)
FROM @tblCodeChars
WHERE CodeChar = SUBSTRING(@chCodeChar, @tintLength, ); SET @tintLength = @tintLength - ;
END RETURN @intCodeIntegerValue;
END
GO
IF OBJECT_ID(N'dbo.ufn_GetCodeChar', 'FN') IS NOT NULL
BEGIN
DROP FUNCTION dbo.ufn_GetCodeChar;
END
GO --==================================
-- 功能: 通过编码整数值获取对应的编码字符
-- 说明: 具体实现阐述
-- 作者: XXX
-- 创建: yyyy-MM-dd
-- 修改: yyyy-MM-dd XXX 修改内容描述
--==================================
CREATE FUNCTION dbo.ufn_GetCodeChar
(
@intCodeIntegerValue INT
) RETURNS CHAR()
--$Encode$--
AS
BEGIN
SET @intCodeIntegerValue = ISNULL(@intCodeIntegerValue, );
DECLARE @chCodeChar AS VARCHAR();
SET @chCodeChar = ''; DECLARE @tintFixLength AS TINYINT;
SET @tintFixLength =dbo.ufn_GetCodeCharFixLength(); IF @intCodeIntegerValue NOT BETWEEN dbo.ufn_GetCodeIntegerValue('A' + REPLICATE('', @tintFixLength - )) AND dbo.ufn_GetCodeIntegerValue(REPLICATE('Z', @tintFixLength))
BEGIN
RETURN @chCodeChar;
END DECLARE @tblCodeChars TABLE(
CodeChar CHAR() NOT NULL,
CodeValue TINYINT NOT NULL
); INSERT INTO @tblCodeChars (CodeChar, CodeValue)
SELECT CodeChar , CodeValue
FROM dbo.ufn_GetCodeChars(); DECLARE @tintPerCodeValue TINYINT;
SET @tintPerCodeValue = ; WHILE @tintFixLength >=
BEGIN
SET @tintPerCodeValue = @intCodeIntegerValue / POWER(, @tintFixLength - ); SELECT TOP @chCodeChar = @chCodeChar + CodeChar, @tintPerCodeValue = CodeValue
FROM @tblCodeChars
WHERE CodeValue <= @tintPerCodeValue
ORDER BY CodeValue DESC; SET @intCodeIntegerValue = @intCodeIntegerValue - @tintPerCodeValue * POWER(, @tintFixLength - ); SET @tintFixLength = @tintFixLength - ;
END RETURN @chCodeChar;
END
GO
测试实现效果
DECLARE @chCodeChar AS CHAR();
SET @chCodeChar = 'A0000';
DECLARE @intValue AS INT;
SET @intValue = dbo.ufn_GetCodeIntegerValue(@chCodeChar); SELECT @chCodeChar AS CurrentCodeChar, @intValue AS CurrentCodeIntegerValue, dbo.ufn_GetCodeChar(@intValue + ) AS NextCodeChar;
GO DECLARE @chCodeChar AS CHAR();
SET @chCodeChar = 'ZZZZY';
DECLARE @intValue AS INT;
SET @intValue = dbo.ufn_GetCodeIntegerValue(@chCodeChar); SELECT @chCodeChar AS CurrentCodeChar, @intValue AS CurrentCodeIntegerValue, dbo.ufn_GetCodeChar(@intValue + ) AS NextCodeChar;
GO







SQL Server获取下一个编码字符实现的更多相关文章
- SQL Server获取下一个编码字符实现继续重构与增强
我在SQL Server获取下一个编码字符实现的博文中,虽然实现了这个问题,但是感觉维护起来比较麻烦,例如如果调整编码字符串的固定长度,就需要变更三个函数,这样的为何成本确实比较大.面向对象编 ...
- SQL Server获取下一个编码字符串的实现方案分割和进位
我在前一种解决方案SQL Server获取下一个编码字符实现和后一种解决方案SQL Server获取下一个编码字符实现继续重构与增强两篇博文中均提供了一种解决编码的方案,考虑良久对比以上两种方 ...
- 【转】sql server 获取每一个类别中值最大的一条数据
/* 数据如下: name val memo a 2 a2(a的第二个值) a 1 a1--a的第一个值 a 3 a3:a的第三个值 b 1 b1--b的第一个值 b 3 b3:b的第三个值 b 2 ...
- sql server 获取每一个类别中值最大的一条数据
/* 数据如下: name val memo a 2 a2(a的第二个值) a 1 a1--a的第一个值 a 3 a3:a的第三个值 b 1 b1--b的第一个值 b 3 b3:b的第三个值 b 2 ...
- 第1/24周 SQL Server 如何执行一个查询
大家好,欢迎来到第1周的SQL Server性能调优培训.在我们进入SQL Server性能调优里枯燥难懂的细节内容之前,我想通过讲解SQL Server如何执行一个查询来建立基础.这个部分非常重要, ...
- 第1周 SQL Server 如何执行一个查询
原文:第1周 SQL Server 如何执行一个查询 大家好,欢迎来到第1周的SQL Server性能调优培训.在我们进入SQL Server性能调优里枯燥难懂的细节内容之前,我想通过讲解SQL Se ...
- SQL Server 2008下日志清理方法 2
SQL Server 2008下日志清理方法 (2011-07-14 10:30:45) 转自 http://blog.sina.com.cn/s/blog_4bdd3d0b0100wfvq.html ...
- SQL Server获取索引创建时间&重建时间&重组时间
之前写过一篇博客"SQL Server中是否可以准确获取最后一次索引重建的时间?",里面主要讲述了三个问题:我们能否找到索引的创建时间?最后一次索引重建(Index Rebuild ...
- SQLServer数据库之SQL Server 获取本周,本月,本年等时间内记录
本文主要向大家介绍了SQLServer数据库之SQL Server 获取本周,本月,本年等时间内记录,通过具体的内容向大家展现,希望对大家学习SQLServer数据库有所帮助. datediff(we ...
随机推荐
- Python中import的使用
python中的import语句是用来导入模块的,在python模块库中有着大量的模块可供使用,要想使用这些文件需要用import语句把指定模块导入到当前程序中. import语句的作用 import ...
- VS常用的配置和插件
- ubuntu 13.10 Ralink RT3290 无线与蓝牙4.0的驱动安装
我的本是hp envy15, 蓝牙与无线的型号是Ralink RT3290, 装了Ubuntu 13.10 64bit后,蓝牙无法使用,无线几秒钟就会断开,查知,是因为驱动问题. ## 准备工作 首先 ...
- Lua截取utf-8编码的中英文混合字符串
参考博客:UTF8字符串在lua的截取和字数统计[转载] 需求 按字面个数来截取子字符串 函数(字符串, 开始位置, 截取长度) utf8sub(,) = 好1世界哈 utf8sub(,) = 你好1 ...
- jquery.pjax.js bug问题解决集锦
jquery.pjax 是一个很好的局部刷新插件,但实际应用过程是还是会有很多小问题,部分问题解决如下: 1.pjax 局部加载时候,IE 存在缓存问题,很容易理解,pjax是通过jquery的aja ...
- CSS3学习笔记--transform中的Matrix(矩阵)
transform: matrix(a,b,c,d,e,f) ,如下图矩阵所示,任意点(x,y,1)经过matrix变化为(ax+cy+e,bx+dy+f,1),由此可以知道,matrix参数与tra ...
- 刨根问底U3D---从Profile中窥探Unity的内存管理
这篇文章包含哪些内容 这篇文章从Unity的Profile组件入手,来探讨一下Unity在开发环境和正式环境中的内存使用发面的一些区别, 并且给出了最好控制内存的方法(我想你已经知道了...Prefa ...
- songtaste网站歌曲真实URL获取
个人挺喜欢songtaste网站的歌曲的,下载方法也层出不穷,可是作为程序员如果不知其中原理的方法真是羞愧.首先简单点的方法当然有google插件这样的嗅探器了,不过这种工具的原理还不是很了解.今天先 ...
- javascript方法 call()和apply()的用法
先上代码: apply()方法示例 /*定义一个人类*/ function Person(name,age) { this.name=name; this.age=age; } /*定义一个学生类*/ ...
- 二十三、【开源】EFW框架Web前端开发之常用组件(FusionCharts图表、ReportAll报表等)
回<[开源]EFW框架系列文章索引> EFW框架源代码下载V1.2:http://pan.baidu.com/s/1hcnuA EFW框架实例源代码下载:http://pan ...