在递增varbinary时混淆TSQL中的结果

时间:2013-03-15 18:38:49

标签: sql sql-server

DECLARE @V AS VARBINARY(8)
SET @V = 0x000000003B654036;
SELECT @V as 'Before'
Set @V = @V+0x0000000000000001;
SELECT @V as 'After'

Before: 0x000000003B654036
After: 0x000000003B654036


Expanding the varbinary result to a larger value I see where the 0x0000000000000001 is going

DECLARE @V AS VARBINARY(8);
DECLARE @R AS VARBINARY(max);
SET @V = 0x000000003B654036;
SELECT @V as 'Before';
SET @R = @V +0x0000000000000001;
SELECT @R as 'After' ;

Before: 0x000000003B654036
After: 0x000000003B6540360000000000000001

但是我正在寻找到0x000000003B65407的结果,我如何通过在二进制值中加1来获得它。

1 个答案:

答案 0 :(得分:2)

T-SQL中的

VARBINARY更像是二进制字符串数据类型,因此+运算符连接这两个值而不是执行数学加法。这是有道理的,因为SQL Server不知道您是在该字段中存储整数,浮点数还是jpeg图像。

在你的情况下,因为你有8个字节,你可以这样:

DECLARE @V AS VARBINARY(8)
DECLARE @W AS VARBINARY(8)
SET @V = 0x000000003B654036;
SELECT @V as 'Before'
Set @W = 0x0000000000000001;
SET @V = CAST( CAST(@V AS BIGINT) + CAST(@W AS BIGINT) AS VARBINARY(8));
SELECT @V as 'After'

如果您有超过8个字节,则必须编写自己的附加代码。在那种情况下,我会考虑CLR。

如果您的所有值都长达8个字节,您也可能希望使用BINARY(8)而不是VARBINARY(8)。这样可以保证磁盘上的一点空间,因为SQL Server不再需要存储每一行​​的长度。