2010年12月10日金曜日

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

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

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


  1. DECLARE @input_value varchar(20) = 'FFFF'  
  2. DECLARE @value varchar(20) = UPPER(REVERSE(@input_value))  
  3. DECLARE @index int = 0  
  4. DECLARE @ans decimal(21, 0) = 0  
  5. DECLARE @COUNT int = 1  
  6. DECLARE @S varchar(1) = '1'  
  7. DECLARE @N int = 1  
  8.    
  9. WHILE (@COUNT < 16)  
  10. BEGIN  
  11.     IF (@COUNT = 1)       SET @S = '1'  
  12.     ELSE IF (@COUNT = 2)  SET @S = '2'  
  13.     ELSE IF (@COUNT = 3)  SET @S = '3'  
  14.     ELSE IF (@COUNT = 4)  SET @S = '4'  
  15.     ELSE IF (@COUNT = 5)  SET @S = '5'  
  16.     ELSE IF (@COUNT = 6)  SET @S = '6'  
  17.     ELSE IF (@COUNT = 7)  SET @S = '7'  
  18.     ELSE IF (@COUNT = 8)  SET @S = '8'  
  19.     ELSE IF (@COUNT = 9)  SET @S = '9'  
  20.     ELSE IF (@COUNT = 10) SET @S = 'A'  
  21.     ELSE IF (@COUNT = 11) SET @S = 'B'  
  22.     ELSE IF (@COUNT = 12) SET @S = 'C'  
  23.     ELSE IF (@COUNT = 13) SET @S = 'D'  
  24.     ELSE IF (@COUNT = 14) SET @S = 'E'  
  25.     ELSE IF (@COUNT = 15) SET @S = 'F'  
  26.   
  27.     SET @index = CHARINDEX(@S, @value)  
  28.   
  29.     WHILE (@index > 0)  
  30.     BEGIN  
  31.         SET @ans += @COUNT * POWER(16, @index - 1)  
  32.         SET @index = CHARINDEX(@S, @value, @index + 1)  
  33.     END  
  34.     SET @COUNT += 1  
  35. END  
  36.   
  37. --Answer  
  38. SELECT  
  39.     @ans AS [ANSWER]  

1 件のコメント:

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

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

    返信削除