SQL Server 将十进制转换为 EBCDIC

问题描述 投票:0回答:1

有人处理过将 SQL Server 数据库写入 EBCDIC 并知道是否有一个函数可以更有效地执行以下操作?

对于剩余的过冲值,只需完成以下操作即可轻松完成。我尝试在微软的网站上搜索,结果一无所获。

CONVERT
CAST
功能是不行的。

简单冗长的手动转换即可:

declare @origValue decimal(10, 4) = -11.20;

with cte_1 as 
(
    select right(cast(@origValue * 100 as smallint), 1) as digit 
)
select
    case when @origValue > 0 then case when digit = '0' then '{' end
         when @origValue < 0 then case when digit = '0' then '}' end
    end
from cte_1

希望有更有效的方法。

sql-server t-sql ebcdic
1个回答
0
投票

您可以使用以下函数将整个值转换为各种大小和比例的分区十进制的 ASCII 表示形式。

CREATE FUNCTION ToZonedDecimalASCII(@Value DECIMAL(38,19), @Size INT, @Scale INT)
RETURNS VARCHAR(50)
AS
BEGIN
    DECLARE @ScaledValue DECIMAL(38,0) = FLOOR(ABS(@Value) * Power(10., @Scale))
    DECLARE @Result VARCHAR(50) = CAST(@ScaledValue AS VARCHAR(50))
    SET @Result = RIGHT(REPLICATE('0', @Size) + @Result, @Size)
    SET @Result =
        STUFF(@Result, @Size, 1, '')
        + TRANSLATE(
            RIGHT(@Result, 1),
            '0123456789',
            IIF(@Value >= 0, '{ABCDEFGHI', '}JKLMNOPQR')
        )
    RETURN @Result
END

请注意,输入大小和精度是一个折衷方案,应涵盖最常见的情况。还可以定义巨大数字或微小分数的替代版本。

结果(带有一些额外的测试值和 EBCDIC/Hex 转换):

价值 尺寸 规模 AScii结果 EbcdicHexResult
0.0000000000000000000 1 0 { 0xC0
555.0000000000000000000 5 0 0055E 0xF0F0F5F5C5
-666.0000000000000000000 5 1 0666} 0xF0F6F6F6D0
777.0000000000000000000 5 2 7770{ 0xF7F7F7F0C0
3.1415926535897931160 10 5 000031415I 0xF0F0F0F0F3F1F4F1F5C9
-1.4142135623730951455 16 15 141421356237309N 0xF1F4F1F4F2F1F3F5F6F2F3F7F3F0F9D5
-11.2000000000000000000 8 2 0000112} 0xF0F0F0F0F1F1F2D0

请参阅 this db<>fiddle 进行演示。

© www.soinside.com 2019 - 2024. All rights reserved.