1

一位朋友问如何在 SQL 中将表示八进制值的 varchar 转换为整数,所以我在这里放置一个答案,看看是否有人改进它。

我曾希望有一个可以作为查询的一部分内联运行的解决方案,而不必在数据库中创建任何函数(例如,如果您只有查询数据库的权限,但不能在其中创建任何新函数或存储过程)。

或者,我看到 .Net Framework ToInt32 方法很容易做到这一点,但似乎跳过了很多 CLR 集成箍才能到达那里。

4

2 回答 2

2

这是我的 quick-n-dirty 迭代版本:

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 回答
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 回答