1

友人が、SQL で 8 進数値を表す varchar を整数に変換する方法を尋ねたので、ここに回答を置いて、誰かがそれを改善するかどうかを確認します。

データベースに関数を作成する必要なく、クエリの一部としてインラインで実行できるソリューションを期待していました (たとえば、データベースにクエリを実行する権限しかなく、新しい関数やストアド プロシージャを作成しない場合など)。

あるいは、.Net Framework の ToInt32 メソッドにはこれを行う簡単な方法があることがわかりますが、そこに到達するために必要な多くの CLR 統合フープを飛び越えているようです。

4

2 に答える 2

2

やや複雑 - 2 レベルのスカラー サブクエリが必要

設定とクエリ

declare @t table (oct varchar(10));
insert @t select '7101';
insert @t select '6';
insert @t select '110111';

select *,
       (select sum(val)
        from
           (
            select substring(reverse(t.oct), v.number, 1) * power(8, v.number-1) val
              from master..spt_values v
             where v.type='p' and v.number between 1 and len(t.oct)
           ) x
       ) intVal
  from @t t;

結果

oct        intVal
---------- -----------
7101       3649
6          6
110111     36937
于 2012-11-16T02:39:02.610 に答える
2

これが私の簡単な反復バージョンです。

CREATE FUNCTION dbo.fn_OctalToInt(@OctalVal varchar(50)) RETURNS BIGINT AS
BEGIN
    DECLARE @pos tinyint = 0
    DECLARE @tot bigint = 0
    WHILE @pos < LEN(@OctalVal) BEGIN
        set @tot = @tot + cast(SUBSTRING(@OctalVal, len(@OctalVal) - @pos, 1) as tinyint) * power(8,@pos)
        set @pos = @pos + 1
    END
    RETURN @tot
END
于 2012-11-16T02:18:06.217 に答える