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来获得它。
答案 0 :(得分:2)
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不再需要存储每一行的长度。