有人处理过将 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
希望有更有效的方法。
您可以使用以下函数将整个值转换为各种大小和比例的分区十进制的 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 进行演示。