got*_*tqn 9 sql t-sql sql-server type-conversion
我有以下字符串,并希望将其转换为DECIMAL(38,0):
a321
Run Code Online (Sandbox Code Playgroud)
以下代码可以:
SELECT CAST(CONVERT(binary(2), 'a321', 2) AS BIGINT); -- 41761
Run Code Online (Sandbox Code Playgroud)
但这失败了:
SELECT CAST(CONVERT(binary(2), 'a321', 2) AS DECIMAL(38,0));
Run Code Online (Sandbox Code Playgroud)
消息8114,级别16,状态5,第7行将数据类型varbinary转换为数值时出错。
像这样进行两个强制转换没什么大不了的:
SELECT CAST(CAST(CONVERT(binary(2), 'a321', 2) AS BIGINT) AS DECIMAL(38,0));
Run Code Online (Sandbox Code Playgroud)
但我想知道为什么不起作用。谁能解释?
这可能是因为您尝试转换的数字是整数,而不是小数。
SELECT CAST(41761 AS VARBINARY), CAST(41761.0 as VARBINARY)
Run Code Online (Sandbox Code Playgroud)
上面给出了不同的结果,因为我怀疑后者携带有关小数部分的信息。同样,当将十进制值转换为二进制时,它会按预期工作。
SELECT CAST(41761.0 as VARBINARY) -- gives 0x060100014A5F0600 on Azure SQL
SELECT CAST(0x060100014A5F0600 as DECIMAL) -- gives 41761 on Azure SQL
Run Code Online (Sandbox Code Playgroud)
我已经在MSDN中标记了服务器,结果在版本之间可能非常不同。
不要构造二进制值,然后将其转换为数值数据类型类别的数据类型。SQL Server 不保证十进制或数字数据类型转换为二进制的结果在 SQL Server 版本之间相同。