SQL Server进制

在项目中,大家可能都遇到过,需要把十进制转换为其他进制的情况,google上一搜,已经有很多2进制、8进制、16进制和十进制的转换方法。但是在一些项目中,这些可能无法满足要求,可能需要17、18甚至是32、36进制和十进制的转换,那么我们应该怎么办呢?不可能为每一种进制都去写一个函数,那样可不是明智之举。所以我这里提供一个十进制与N进制之间的互转函数(N<=32)。

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进制函数,那么我们再生产一些唯一编码、订单号等一些编码时,就可以用更少的位数,表示更大的范围

一   基础--进制转化

今天第一天正式上课学习的是基础<进制转化>,上面的图表达的是各种进制之间的关系,同时也表达了学习IT的学习方法< 学习一个建模思想  形成处理事情条理化的条件反射>

今天起我这只树上的蜗牛将开始一点一点的将我经历的内容全部点滴记录下来。

1 学习目的

学习一个建模思想  形成处理事情条理化的条件反射。

2 主要内容

简介  十进制有10个基数:0-9;二进制有两个基数:0-1;八进制有八个基数:0-7;十六进制有16个基数:0-9;A(10)-F(15);

1)十进制A到其他进制B(A进制到B进制)

要点:就用A除以B,用短除法并取余,直到商为0,由下到上余数连接即为B;

2)二进制---十进制

步骤 1 写底数 2写指数(右到左从0开始)3乘系数 (右到左)4 累加

例 0,111(二进制)         7(十进制)

1)2 2 2 2

2)2³+2²+2 +2º

3)0*2³+1*2²+1*2 +1*2º

4)0+4+2+1=7

同理 其他进制A到十进制即可使用公式

3)其他进制转化

1  *二进制到八进制

从右到左,三位数字一组利用421(二进制111到十进制即为4+2+1=7)进行转化;

*二进制到十六进制

从右到左,四位数字一组利用8421(二进制1111到十进制即为8+4+2+1=15)进行转化;

2 八进制到二进制/十六进制到二进制

遵循八进制/十六进制的每一位数字就用二进制代替即可;

来自网络大卡的深解

C#中二进制、八进制、十六进制和十进制之间的相互转化问题

首先来简单的看一下,C#本身自带的X进制之间的转换功能如下:

//十进制转二进制 Console.WriteLine(Convert.ToString(69, 2));

//十进制转八进制 Console.WriteLine(Convert.ToString(69, 8));

//十进制转十六进制 Console.WriteLine(Convert.ToString(69, 16));

//二进制转十进制 Console.WriteLine(Convert.ToInt32(”100111101″, 2));

//八进制转十进制 Console.WriteLine(Convert.ToInt32(”76″, 8));

//十六进制转十进制 Console.WriteLine(Convert.ToInt32(”FF”, 16));

十六进制 转向 十进制:

int myTempR = int.Parse("EA",System.Globalization.NumberStyles.HexNumber);

十进制 转向 十六进制:

this.myResult.Text = myTempR.ToString("X");

C#语言有很多值得学习的地方,这里我们主要介绍C#实现转换十六进制,包括介绍用来表示十六进制的枚举值是 HexNumber等方面。

  C#实现转换十六进制

  任何数据在计算机内部都是以二进制保存的,所以进制与数据的存储无关,只与输入输出有关。所以,对于进制转换,我们只关心字符串中的结果。

  在上面的第 4 条中提到了 ToString() 方法可以将数值转换成字符串,不过在字符串中,结果是以十进制显示的。现在我们带给它加一些参数,就可以让C#实现转换成十六进制——使用 ToString(string) 方法。

  这里需要一个 string 类型的参数,这就是格式说明符。十六进制的格式说明符是 "x" 或者 "X",使用这两种格式说明符的区别主要在于 A-F 六个数字:"x" 代表 a-f 使用小写字母表示,而 "X" 而表示 A-F 使用大字字母表示。如下例:

private void TestHex()

 { 

  int a = 188;

   this.textBox1.Text = ""; 

  this.textBox1.AppendText("a(10) = " + a.ToString() + "\n"); 

  this.textBox1.AppendText("a(16) = " + a.ToString("x") + "\n"); 

  this.textBox1.AppendText("a(16) = " + a.ToString("X") + "\n"); 

  } 

  运行结果如下:

a(10) = 188  

a(16) = bc  

a(16) = BC 

  这时候,我们可能有另一种需求,即为了显示结果的整齐,我们需要控制十六进制表示的长度,如果长度不够,用前导的 0 填补。解决这个问题,我们只需要在格式说明符“x”或者“X”后写上表示长度的数字就行了。比如,要限制在 4 个字符的长度,可以写成“X4”。在上例中追加一句:

this.textBox1.AppendText("a(16) = " + a.ToString("X4") + "\n"); 

  其结果将输出 a(16) = 00BC。

  现在,我们还要说一说如何将一个表示十六进制数的字符串转换成整型。这一转换,同样需要借助于 Parse() 方法。这里,我需要 Parse(string,System.Globalization.NumberStyles) 方法。第一个参数是表示十六进制数的字符串,如“AB”、“20”(表示十进制的 32) 等。第二个参数 System.Globalization.NumberStyles 是一个枚举类型,用来表示十六进制的枚举值是 HexNumber。因此,如果我们要将“AB”转换成整型,就应该这样写:int b = int.Parse("AB", System.Globalization.NumberStyles.HexNumber),最后得到的 b 的值是 171。

时间: 2024-11-05 18:56:24

SQL Server进制的相关文章

SQL Server 进制转换函数

一.背景 前段时间群里的朋友问了一个问题:“在查询时增加一个递增序列,如:0x00000001,即每一个都是36进位(0—9,A--Z),0x0000000Z后面将是0x00000010,生成一个像下面的映射表“: (Figure1:效果图) 二.十进制转换为十六进制 在网上有很多资料关于使用SQL语句把十进制转换为十六进制的资料,比如: --方式1 SELECT CONVERT(VARBINARY(50), 23785) 执行返回值为0x00005CE9,但是需要注意的是,这本应该返回二进制的

sql 进制转换,支持93内的进制相互转换

功能:实现在SQL内进制的互相转换,支持从2 - 93进制内的转换,若需要支持其他字符,可以自定义@ym变量实现扩充 1 -- ============================================= 2 -- Author: bwch 3 -- Create date: 2014年9月30日10:32:47 4 -- Description: 把一个数字转换成指定进制,最大支持93进制,也可在Function内扩充@ym实现其他的转换 5 -- ===============

SQL SERVER 自定义函数 整数转成指定长度的16进制 转换成指定长度的16进制 不足补0

最近做项目扩展的时候,遇到问题就是将整型转换成指定长度的16进制 刚开始就是直接使用 cast(12 as varbinary(4))但是发现这个不能解决我的问题 所以就上网搜了一下,然后改了改,下面就是函数: 1 Create Function IntToHexLength(@Num int,@HxLength int) 2 returns varchar(16) 3 as 4 begin 5 declare @Mods int,@res varchar(16),@Length int 6 s

初学sql server数据基础(初学者进) 看了关注我哦,不定时更新!

学习目标:创建第一个数据库! 第一步:启动sql Server 的本地服务,如不打开是打开不了的 右键“我的电脑”→“管理”→打开“服务和应用程序”分类→点击服务,启动一个叫SQL Server(MSSQLSERVER) 的服务 如图: 第二步:打开Sql Server数据库 第三步: 这样第一个数据库就创建好啦!

SQL SERVER大话存储结构(1)

阅读目录(Content) 1 数据页的类型 1.1 PFS 1.2.3 IAM 2 数据页结构 2.1 页头 2.2 行记录 2.3 空闲空间 2.4 行偏移量 3 查询数据页存储格式的途径 3.1 dbcc ind 3.1.1 语法说明 3.1.2 测试案例 3.2 dbcc page 3.2.1 语法说明 3.2.2 测试案例 如果转载,请注明博文来源: www.cnblogs.com/xinysu/   ,版权归 博客园 苏家小萝卜 所有.望各位支持! SQLServer的数据页大小是8

SQL SERVER大话存储结构(2)

阅读目录(Content) 1 行记录如何存储 1.1 堆表 1.2 聚集索引表格 2 非聚集索引结构 3 非聚集索引键值内容 3.1 堆表上的非聚集索引 3.2 聚集索引表(唯一)的非聚集索引 3.3 聚集索引表(非唯一)的非聚集索引 4 非聚集索引如何查找页 如果转载,请注明博文来源: www.cnblogs.com/xinysu/   ,版权归 博客园 苏家小萝卜 所有.望各位支持! 本系列上一篇博文链接:SQL SERVER大话存储结构(1)_数据页类型及页面指令分析 回到顶部(go t

SQL SERVER大话存储结构(3)

阅读目录(Content) 1 引入 2 数据行 2.1 数据行结构 2.2 特殊情况(大对象.行溢出及forword) 2.2.1 大对象 2.2.2 行溢出 2.2.3 forword 3 测试存储情况 3.1 堆表分析 3.2 添加主键 3.3 增加一列:可空变长列 3.4 增加一列:非空变长列+默认值 3.4.1 非大对象列 3.5 删除无数据的列 3.6 删除有数据的列 3.7 行溢出 3.8 Forword 4 行结构与DDL 一行数据是如何来存储的呢? 变长列与定长列,NULL与N

无需密码攻击 Microsoft SQL Server

最近的一次渗透测试里,在我们捕获的一些数据包中发现了一些未经加密的 Microsoft SQL Server(MSSQL) 流量.起初,我们认为这样就可以直接嗅探到认证凭证,然而,MSSQL 加密了认证的流量,这就意味着我们需要先解密才能获取到认证凭证.如果安装的是一个自签名证书,就很容易进行破解. 不幸的是,破解 MSSQL 加密不在授权范围之内,我们不得不先放下好奇心完成对客户的渗透测试.不过,因为心里总想着一件事以至于无法继续正常进行工作,我们可以在没有用户凭证的情况下攻击 SQL Ser

50种方法优化SQL Server数据库查询(转载)

原文地址:http://www.cnblogs.com/zhycyq/articles/2636748.html 查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7.锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷) 8.sp_lock,sp_who,活动的用