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 上相同。
小数和整数在 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)
上面的打印语句分别返回1和65537。
至于你的最终目标,将整数存储为 varbinary 以节省空间,我认为你自己已经回答了这个问题 - 不值得。
| 归档时间: |
|
| 查看次数: |
2045 次 |
| 最近记录: |