我有以下字符串,并将其转换为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));
消息8114,级别16,状态5,第7行,转换数据类型时出错 varbinary转换为数值。
做两个这样的演员转换没什么大不了的:
SELECT CAST(CAST(CONVERT(binary(2), 'a321', 2) AS BIGINT) AS DECIMAL(38,0));
但是我想知道为什么不起作用。谁能解释?
答案 0 :(得分:3)
先转换为bigint
,然后转换为小数:
SELECT CONVERT(DECIMAL(38, 0), CONVERT(BIGINT, CONVERT(binary(2), 'a321', 2)))
小数的二进制表示形式与整数有很大的不同,并不是所有的二进制表示形式都可以转换为小数形式。
答案 1 :(得分:1)
这可能是因为您要转换的数字是整数,而不是十进制。
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,表明结果在各个版本之间可能会非常不同。
请勿构造二进制值,然后将其转换为数字数据类型类别的数据类型。 SQL Server不保证将十进制或数字数据类型转换为二进制的结果在SQL Server的两个版本之间是相同的。