无法直接转换为十进制值?

时间:2019-04-01 14:24:47

标签: sql sql-server tsql type-conversion

我有以下字符串,并将其转换为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));

但是我想知道为什么不起作用。谁能解释?

2 个答案:

答案 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的两个版本之间是相同的。