2010年12月10日金曜日

SQL Serverで16進数を10進数に変換する

Oracleとかだったら標準的な関数として搭載されていそうなものですが、残念ながらSQL Serverにはない。

会社の先輩に言われ、テストデータ作成用に作ったもの。
もったいないので公開しておく。


DECLARE @input_value varchar(20) = 'FFFF'
DECLARE @value varchar(20) = UPPER(REVERSE(@input_value))
DECLARE @index int = 0
DECLARE @ans decimal(21, 0) = 0
DECLARE @COUNT int = 1
DECLARE @S varchar(1) = '1'
DECLARE @N int = 1
 
WHILE (@COUNT < 16)
BEGIN
    IF (@COUNT = 1)       SET @S = '1'
    ELSE IF (@COUNT = 2)  SET @S = '2'
    ELSE IF (@COUNT = 3)  SET @S = '3'
    ELSE IF (@COUNT = 4)  SET @S = '4'
    ELSE IF (@COUNT = 5)  SET @S = '5'
    ELSE IF (@COUNT = 6)  SET @S = '6'
    ELSE IF (@COUNT = 7)  SET @S = '7'
    ELSE IF (@COUNT = 8)  SET @S = '8'
    ELSE IF (@COUNT = 9)  SET @S = '9'
    ELSE IF (@COUNT = 10) SET @S = 'A'
    ELSE IF (@COUNT = 11) SET @S = 'B'
    ELSE IF (@COUNT = 12) SET @S = 'C'
    ELSE IF (@COUNT = 13) SET @S = 'D'
    ELSE IF (@COUNT = 14) SET @S = 'E'
    ELSE IF (@COUNT = 15) SET @S = 'F'

    SET @index = CHARINDEX(@S, @value)

    WHILE (@index > 0)
    BEGIN
        SET @ans += @COUNT * POWER(16, @index - 1)
        SET @index = CHARINDEX(@S, @value, @index + 1)
    END
    SET @COUNT += 1
END

--Answer
SELECT
    @ans AS [ANSWER]


1 件のコメント:

  1. これ、GUIDとか32桁の16進数を数値に変換させようと思ったら、算術オーバーフローがでましたわ。
    すいません。

    改めて検証したら、FFFFFFFFまでぐらいしか変換できぬのです。
    後日、修正したものを再投稿します。

    返信削除