我有以下字符串,并希望将其转换为DECIMAL(38,0)
a321
以下代码是可以的:
SELECT CAST(CONVERT(binary(2), 'a321', 2) AS BIGINT); -- 41761
但这次失败了:
SELECT CAST(CONVERT(binary(2), 'a321', 2) AS DECIMAL(38,0));
Msg 8114,级别16,状态5,第7行将数据类型var二进制转换为数字错误。
做两个这样的角色没什么大不了的:
SELECT CAST(CAST(CONVERT(binary(2), 'a321', 2) AS BIGINT) AS DECIMAL(38,0));
但我想知道为什么不行。有人能解释吗?
发布于 2019-04-02 02:26:31
这可能是因为您要转换的数字是整数,而不是十进制。
SELECT CAST(41761 AS VARBINARY), CAST(41761.0 as VARBINARY)
上面的结果给出了不同的结果,因为我怀疑后者携带了关于十进制组件的信息。同样,当将十进制值转换为二进制时,它的工作原理是预期的。
SELECT CAST(41761.0 as VARBINARY) -- gives 0x060100014A5F0600 on Azure SQL
SELECT CAST(0x060100014A5F0600 as DECIMAL) -- gives 41761 on Azure SQL
我已经标记了服务器,因为MSDN声明,结果可能非常不同版本之间。
不要构造二进制值,然后将它们转换为数值数据类型类别的数据类型。Server并不保证将十进制或数字数据类型转换为二进制数据类型的结果在Server版本之间是相同的。
发布于 2019-04-01 06:27:48
先转换为bigint
,然后转换为十进制:
SELECT CONVERT(DECIMAL(38, 0), CONVERT(BIGINT, CONVERT(binary(2), 'a321', 2)))
小数的二进制表示与整数有很大的不同,并不是所有的二进制表示都可以转换为十进制。
https://stackoverflow.com/questions/55457450
复制相似问题