对于非常大的数字,在 SQL 服务器中将基数 10 转换为基数 2
Convert base 10 to base 2 in SQL Server for very large numbers
在 SQL Server 2017 上,我有一个以 10 为基数的类型 DECIMAL(38,0)
,我需要将其转换为以 2 为基数的表示形式。
这适用于较小的数字,但在目标数量级时失败:
DECLARE @var1 DECIMAL(38, 0) = 2679226456636072036565806253187530752;
WITH A
AS (SELECT @var1 AS NUMBER,
CAST('' AS VARCHAR(125)) AS BITS
UNION ALL
SELECT CAST(ROUND(NUMBER / 2, 0, 1) AS DECIMAL(38, 0)),
CAST(BITS + CAST(NUMBER % 2 AS VARCHAR(125)) AS VARCHAR(125))
FROM A
WHERE NUMBER > 0)
SELECT NUMBER,
RIGHT(REPLICATE('0', 125) + CASE
WHEN BITS = ''
THEN '0'
ELSE REVERSE(BITS)
END, 125) AS BIN_VALUE
FROM A
WHERE NUMBER = 0;
错误消息显示为 Msg 8115, Level 16, State 2, Line 2 Arithmetic overflow error converting expression to data type numeric.
我也尝试过其他方法,但由于原始值的大小,每种方法都失败了。非常感谢执行此转换的任何帮助。
--DECLARE @var1 DECIMAL(38, 0) = 2679226456636072036565806253187530752;
DECLARE @var1 DECIMAL(38, 0) = 99999567999999999999999999999999999999;
WITH A
AS
(
SELECT @var1 AS NUMBER,
CAST('' AS VARCHAR(130)) AS BITS
UNION ALL
SELECT CAST(
cast(round(NUMBER*0.1, 0, 1) as decimal(38,0))*5 --high part
+
round(cast('0.'+right(NUMBER, 1) as decimal(10,2))* 5, 0, 1) --low part
--ROUND(NUMBER * 0.5, 0, 1)
AS DECIMAL(38, 0)),
CAST(BITS + CAST(NUMBER % 2 AS VARCHAR(125)) AS VARCHAR(130))
FROM A
WHERE NUMBER > 0
)
SELECT NUMBER,
RIGHT(REPLICATE('0', 130) + CASE
WHEN BITS = ''
THEN '0'
ELSE REVERSE(BITS)
END, 130) AS BIN_VALUE
FROM A
WHERE NUMBER = 0
option (maxrecursion 0);
在 SQL Server 2017 上,我有一个以 10 为基数的类型 DECIMAL(38,0)
,我需要将其转换为以 2 为基数的表示形式。
这适用于较小的数字,但在目标数量级时失败:
DECLARE @var1 DECIMAL(38, 0) = 2679226456636072036565806253187530752;
WITH A
AS (SELECT @var1 AS NUMBER,
CAST('' AS VARCHAR(125)) AS BITS
UNION ALL
SELECT CAST(ROUND(NUMBER / 2, 0, 1) AS DECIMAL(38, 0)),
CAST(BITS + CAST(NUMBER % 2 AS VARCHAR(125)) AS VARCHAR(125))
FROM A
WHERE NUMBER > 0)
SELECT NUMBER,
RIGHT(REPLICATE('0', 125) + CASE
WHEN BITS = ''
THEN '0'
ELSE REVERSE(BITS)
END, 125) AS BIN_VALUE
FROM A
WHERE NUMBER = 0;
错误消息显示为 Msg 8115, Level 16, State 2, Line 2 Arithmetic overflow error converting expression to data type numeric.
我也尝试过其他方法,但由于原始值的大小,每种方法都失败了。非常感谢执行此转换的任何帮助。
--DECLARE @var1 DECIMAL(38, 0) = 2679226456636072036565806253187530752;
DECLARE @var1 DECIMAL(38, 0) = 99999567999999999999999999999999999999;
WITH A
AS
(
SELECT @var1 AS NUMBER,
CAST('' AS VARCHAR(130)) AS BITS
UNION ALL
SELECT CAST(
cast(round(NUMBER*0.1, 0, 1) as decimal(38,0))*5 --high part
+
round(cast('0.'+right(NUMBER, 1) as decimal(10,2))* 5, 0, 1) --low part
--ROUND(NUMBER * 0.5, 0, 1)
AS DECIMAL(38, 0)),
CAST(BITS + CAST(NUMBER % 2 AS VARCHAR(125)) AS VARCHAR(130))
FROM A
WHERE NUMBER > 0
)
SELECT NUMBER,
RIGHT(REPLICATE('0', 130) + CASE
WHEN BITS = ''
THEN '0'
ELSE REVERSE(BITS)
END, 130) AS BIN_VALUE
FROM A
WHERE NUMBER = 0
option (maxrecursion 0);