如何在MS SQL Server 2014中将EBCDIC分区十进制转换为十进制?

时间:2017-05-04 15:09:02

标签: sql-server

大家好,这对我来说很重要,我一直在努力,但没有取得成功 db中的数据为长度为9的[AH_TRAN_CV]为Integer。我希望在varchar中有9个char和2个小数。
我想这整个代码可能都是错的,因为我没有知识只是用互联网来到这里..样本就像

123D is +1234
678{ is +6780
468K is -4682
Digit Positive Negative 
0         {        }
1         A        J
2         B        K
3         C        L
4         D        M
5         E        N
6         F        O
7         G        P
8         H        Q
9         I        R
  亲切的帮助。以下只是代码的一部分
代码:

Case When (substring(convert(varchar,[AH_TRAN_CV] * 0.0000001), 9, 1)  = '4' 
      and ([AH_TRAN_CV] >= 0.00)) 
        Then concat (substring(convert(varchar,[AH_TRAN_CV]*0.0000001), 3, 8), 'D')
end [AH_TRAN_CV]

1 个答案:

答案 0 :(得分:0)

此编码不是可以解析为数字的数字格式。它只是在大型机中找到的EBCDIC zoned decimal encoding

您可以创建一个分割字符串的函数,并从输入字符串生成相应的符号和最后一位数字,例如:

create function ZonedToNumber(@somenum varchar(20))
returns varchar(20)
as
begin

declare @c char = right(@somenum,1);

declare @digit char = case when @c between 'A' and 'I' then (ascii(@c) -64)
                        when @c between 'J' and 'R' then (ascii(@c) -73)
                        when @c in ('{','}') then 0
                        else null end

declare @sign char = case when @c between 'A' and 'I' or @c = '{' then '+'
                    when @c between 'J' and 'R' or @c = '}' then '-'
                    else null end

RETURN CONCAT(@sign,left(@somenum,len(@somenum)-1)  ,@digit)
end

该函数使用CASE而不是执行任何巧妙的算术,并为每种情况减去基本ASCII值以生成最后一位数字和符号。

您可以将该函数应用于分区十进制字符串以将其转换为实际数字,例如:SELECT dbo.ZonedToNumber('1234')将返回=1234。您也可以在查询中使用它:

declare @t table (num varchar(20))
insert into @t 
values
('123D'),
('123K'),
('123{'),
('123}')

select cast(dbo.ZonedToNumber(num) as int)
from @t x

这将返回:

1234
-1232
1230
-1230

在加载数据时,您应该仅使用此函数将分区小数转换为实际数字。几乎没有人(大型机外)不再使用这种格式了。