一位朋友问如何在 SQL 中将表示八进制值的 varchar 转换为整数,所以我在这里放置一个答案,看看是否有人改进它。
我曾希望有一个可以作为查询的一部分内联运行的解决方案,而不必在数据库中创建任何函数(例如,如果您只有查询数据库的权限,但不能在其中创建任何新函数或存储过程)。
或者,我看到 .Net Framework ToInt32 方法很容易做到这一点,但似乎跳过了很多 CLR 集成箍才能到达那里。
一位朋友问如何在 SQL 中将表示八进制值的 varchar 转换为整数,所以我在这里放置一个答案,看看是否有人改进它。
我曾希望有一个可以作为查询的一部分内联运行的解决方案,而不必在数据库中创建任何函数(例如,如果您只有查询数据库的权限,但不能在其中创建任何新函数或存储过程)。
或者,我看到 .Net Framework ToInt32 方法很容易做到这一点,但似乎跳过了很多 CLR 集成箍才能到达那里。
这是我的 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
有点复杂 - 需要 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