日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

SQL Server進(jìn)制

系統(tǒng) 2955 0

在項(xiàng)目中,大家可能都遇到過,需要把十進(jìn)制轉(zhuǎn)換為其他進(jìn)制的情況,google上一搜,已經(jīng)有很多2進(jìn)制、8進(jìn)制、16進(jìn)制和十進(jìn)制的轉(zhuǎn)換方法。但是在一些項(xiàng)目中,這些可能無法滿足要求,可能需要17、18甚至是32、36進(jìn)制和十進(jìn)制的轉(zhuǎn)換,那么我們應(yīng)該怎么辦呢?不可能為每一種進(jìn)制都去寫一個(gè)函數(shù),那樣可不是明智之舉。所以我這里提供一個(gè)十進(jìn)制與N進(jìn)制之間的互轉(zhuǎn)函數(shù)(N<=32)。

N進(jìn)制函數(shù)

1、準(zhǔn)備工作

在寫N進(jìn)制函數(shù)之前,需要有一個(gè)用于存儲(chǔ)表示N進(jìn)制字符的基礎(chǔ)表,這里我用一個(gè)表函數(shù)表示:

    
      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、十進(jìn)制轉(zhuǎn)換為N進(jì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進(jìn)制轉(zhuǎn)換為十進(jì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
    
  

注意:目前測(cè)試下來對(duì)于最高進(jìn)制(36進(jìn)制),最多支持13位,但是我想這也足夠了,因?yàn)?6進(jìn)制所能表示的范圍遠(yuǎn)比10進(jìn)制的13位數(shù)大得多,0<=y<=36 * 36 12 + 36 * 36 11 +......+ 36 * 36 1 + 36。所以一個(gè)N進(jìn)制來說能表示的范圍應(yīng)該為:0<=y<=N * N x + N * N x-1 +......+ N * N 1 + N。

如何使用

那么我們應(yīng)該怎么使用這些函數(shù)呢,這里舉一個(gè)自增36進(jìn)制字段的表的例子。

首先創(chuàng)建一個(gè)表:

    
      CREATE TABLE 
    
    xavi
    
      .
    
    tb_Test


    
      (

    
    
    ID 
    
      CHAR
    
    
      (
    
    10
    
      ) 
    
    
      PRIMARY KEY
    
    
      ,

    
    
    Account 
    
      VARCHAR
    
    
      (
    
    20
    
      ),

    
    
    [Name] 
    
      NVARCHAR
    
    
      (
    
    10
    
      )

)
    
  

然后創(chuàng)建一個(gè)觸發(fā)器:

    
      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
  

接著往這個(gè)表里插入100條冊(cè)數(shù)數(shù)據(jù):

    
      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
    
  

執(zhí)行看下表里的數(shù)據(jù),可以得到如下圖的結(jié)果:

N System Test Result

從這個(gè)結(jié)果應(yīng)該可以觀察到,ID這一列已經(jīng)是36進(jìn)制的表示形式了。

擴(kuò)展用法

有了這個(gè)N進(jìn)制函數(shù),那么我們?cè)偕a(chǎn)一些唯一編碼、訂單號(hào)等一些編碼時(shí),就可以用更少的位數(shù),表示更大的范圍。

SQL Server進(jìn)制


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 兴和县| 长乐市| 城步| 贵州省| 阿克| 稻城县| 资溪县| 汶上县| 科尔| 宜兰县| 东阳市| 彰武县| 诏安县| 昭觉县| 徐州市| 郎溪县| 纳雍县| 苗栗市| 乐都县| 广元市| 前郭尔| 安溪县| 富川| 嘉鱼县| 南昌市| 庆阳市| 锡林郭勒盟| 新邵县| 颍上县| 芷江| 静宁县| 西乌珠穆沁旗| 楚雄市| 桃江县| 米林县| 武威市| 长丰县| 文登市| 星座| 海安县| 青龙|