N进制函数
1、准备工作
在写N进制函数之前,需要有一个用于存储表示N进制字符的基础表,这里我用一个表函数表示:
CREATE FUNCTION xavi.fn_NSystemTable()
RETURNS @temp TABLE (id SMALLINT IDENTITY, [Char] CHAR(1),[Ascii] SMALLINT)
AS
BEGIN
DECLARE @ignoreAscii TABLE ([Ascii] SMALLINT)
DECLARE @i INT
SET @i = 58
WHILE(@i <= 64)
BEGIN
INSERT INTO @ignoreAscii VALUES (@i)
SET @i = @i + 1
END
SET @i = 0
WHILE(@i < 43)
BEGIN
IF NOT EXISTS (SELECT 1 FROM @ignoreAscii WHERE [Ascii] = @i + 48)
BEGIN
INSERT INTO @temp VALUES (CHAR(@i + 48),@i + 48)
END
SET @i = @i + 1
END
RETURN
END
2、十进制转换为N进制
CREATE FUNCTION xavi.fn_DecimalToNSystem (@bigInt BIGINT, @n TINYINT)
RETURNS VARCHAR(100)
AS
BEGIN
Declare @result VARCHAR(100),@mode INT,@remainder INT, @iRet CHAR(1)
SELECT @mode = @bigInt, @result = ''
WHILE(1 = 1)
BEGIN
IF(@bigInt = 0 OR @n = 0 OR @n = 1)
BEGIN
SET @result = CONVERT(VARCHAR(100),@bigInt)
BREAK
END
IF(@mode = 0)
BEGIN
BREAK
END
SET @remainder = @mode % @n
SET @mode = @mode / @n
SELECT @iRet = [Char] FROM xavi.fn_NSystemTable() ns WHERE ns.id = @remainder + 1
SET @result = @iRet + @result
END
RETURN @result
END
3、N进制转换为十进制
CREATE FUNCTION xavi.fn_NSystemToDecimal (@nSys VARCHAR(100), @n TINYINT)
RETURNS BIGINT
AS
BEGIN
Declare @result int,@iPos int,@iTmp int
Select @result = 0,@iPos = 0
While(@iPos < Len(@nSys))
BEGIN
SELECT @iTmp = ns.id - 1 FROM xavi.fn_NSystemTable() ns WHERE ns.[Char] = SUBSTRING(@nSys,LEN(@nSys) - @iPos,1)
Set @result = @result + @iTmp * POWER(CAST(@n AS BIGINT),cast(@iPos AS BIGINT))
Set @iPos = @iPos + 1
END
RETURN @result
END
注意:目前测试下来对于最高进制(36进制),最多支持13位,但是我想这也足够了,因为36进制所能表示的范围远比10进制的13位数大得多,0<=y<=36 * 3612+ 36 * 3611+......+ 36 * 361+ 36。所以一个N进制来说能表示的范围应该为:0<=y<=N
* Nx+ N * Nx-1+......+ N * N1+ N。
如何使用
那么我们应该怎么使用这些函数呢,这里举一个自增36进制字段的表的例子。
首先创建一个表:
CREATE TABLE xavi.tb_Test
(
ID CHAR(10) PRIMARY KEY,
Account VARCHAR(20),
[Name] NVARCHAR(10)
)
然后创建一个触发器:
CREATE TRIGGER xavi.tr_TestInsert
ON xavi.tb_Test
INSTEAD OF INSERT
AS
SET NOCOUNT ON
DECLARE @maxID BIGINT,
@n TINYINT,
@nSystemChar VARCHAR(10)
SET @n = 36
SELECT @maxID = ISNULL(MAX(xavi.fn_NSystemToDecimal(ID,@n)),0) FROM xavi.tb_Test
SET @nSystemChar = xavi.fn_DecimalToNSystem(@maxID + 1, @n)
INSERT INTO xavi.tb_Test(ID,Account,[Name])
SELECT REPLICATE('0',10 - LEN(@nSystemChar)) + @nSystemChar,
Account,
[Name]
FROM INSERTED
接着往这个表里插入100条册数数据:
DECLARE @i INT
SET @i = 1
WHILE(@i <= 100)
BEGIN
INSERT INTO xavi.tb_Test
VALUES(@i,LEFT(REPLACE(CONVERT(VARCHAR(100),NEWID()),'-',''),10),LEFT(REPLACE(CONVERT(VARCHAR(100),NEWID()),'-',''),10))
SET @i = @i + 1
END
执行看下表里的数据,可以得到如下图的结果:
从这个结果应该可以观察到,ID这一列已经是36进制的表示形式了。
扩展用法
有了这个N进制函数,那么我们再生产一些唯一编码、订单号等一些编码时,就可以用更少的位数,表示更大的范围。
相关推荐
一般常见为36进制转10进制,但为了区分26个字母中O和I与阿拉伯数字0和1相似,所以特殊情况会用34进制转10进制( 三十四进制转十进制 )的换算。目的是排除26个字母中O和I,24个字母+10个阿拉伯数字=34。...
select number16,substring(number16,1,1) a,substring(number16,2,1) b, substring(number16,3,1) c, substring(number16,4,1) d, substring(number16,5,1) e,substring(number16,6,1) f, substring(number16,7,1) ...
SQL Server中,在“整型数字”和“字符串表示的十六进制数字”之间进行转换的函数: IntToHex 数字转十六进制 HexToInt 十六进制转数字
工作中遇到需要查看SQLServer数据库中的二进制字段,网上没有免费版本的,所以自己动手开发了一个。原理就是把数据库中二进制下载到本地文件,可以指定存储的根目录,根目录下是当前表的名字新建的文件夹,文件名...
sql 2005 十六进制转换十进制.sql 各进制之间的相互转化
这是俺自己写的小程序,sql server 二进制图片批量。
使用delphi读写sqlserver中image字段,可以读取dmp,jpg,gif等格式的图片,至于二进制文件没有尝试过。
SQL语句写的各进制之间互相转换,如二进制转换十进制,八进制转换十六进制等等
SQL SERVER二进制错误检测工具,解决出现二进制错误时难找错误的尴尬场景
使用简单的SQL语法,查询二进制字段存储内容
一个SQL脚本函数,16进制转换为10进制数
将数据库中二进制文件导出到文件,代码仅供参考。如有问题请多多联系
sql server 表中字段二进制截取查找,快速定位不合规字段
SQLSERVER_后台导入二进制数据方法
SQL进制转换函数,方便快捷,希望能够帮到各位老铁。。。。。。。。。。。。。。。。。。
如何把图片以二进制方式存入SQL_Server数据库_并能读取出来
适用于SQL SERVER 2000、2005、2008 自动导出数据库文档(doc格式)
一个SQL脚本函数,10进制转换为36进制。36进制指以0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F、G、H、I、J、K、L、M、N、O、P、Q、R、S、T、U、V、W、X、Y、Z为基数做累加。
有一个员工表Employee,需要保存员工照片(Photo)到数据库(sql server)上。员工照片对应的字段是varbinary(max),也就是要存成二进制文件类型(这和以前讨巧地存图片文件路径就不相同了),默认可以为空。
aspnet(C#)实现从sqlserver数据库中下载以二进制存储的图片 京华志&精华志出品 分享资源 C# ASP.NET SQL DBA 源码