CONVERT() 出现此问题的原因是什么?

Han*_*non 12 sql-server-2008 sql-server sql-server-2012

考虑以下两个语句:

PRINT CONVERT(NUMERIC(38, 0), 0x0100000001, 0);
PRINT CONVERT(NUMERIC(38, 0), 0x0100010001, 0);
Run Code Online (Sandbox Code Playgroud)

两个语句都返回-1;这不是不正确,因为第二个二进制值比第一个值高 65,536 十进制,不是吗?

这肯定不是由于无声截断?

如果我运行以下语句:

PRINT CONVERT(NUMERIC(38, 0),   0x00000001, 0);
PRINT CONVERT(NUMERIC(38, 0),   0x00010001, 0);
Run Code Online (Sandbox Code Playgroud)

我遇到了以下错误:

Msg 8114, Level 16, State 5, Line 1
Error converting data type varbinary to numeric.
Run Code Online (Sandbox Code Playgroud)

我如何诊断这里发生了什么?

我在 SQL Server 2012 v11.0.5058 上运行它。结果在 SQL Server 2008 R2 SP2、SQL Server 2005 和 SQL Server 2000 上相同。

Aar*_*and 2

小数和整数在 varbinary 中的编码方式非常不同。小数需要更多空间。尝试:

SELECT CONVERT(VARBINARY(32), 1), CONVERT(VARBINARY(32), 1.0);
Run Code Online (Sandbox Code Playgroud)

为了返回正确的结果,您需要int首先将 varbinary 值转换为 , ,如下所示:

PRINT CONVERT(NUMERIC(38, 0),   convert(int, 0x00000001), 0); 
PRINT CONVERT(NUMERIC(38, 0),   convert(int, 0x00010001), 0);
Run Code Online (Sandbox Code Playgroud)

上面的打印语句分别返回165537

至于你的最终目标,将整数存储为 varbinary 以节省空间,我认为你自己已经回答了这个问题 - 不值得。