1
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 添加到二进制值来获得它。

4

1 回答 1

2

VARBINARY在 T-SQL 中更像是二进制字符串数据类型,因此+运算符将两个值连接起来,而不是执行数学加法。这是有道理的,因为 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。

您可能还想查看 usingBINARY(8)而不是VARBINARY(8)所有值的长度始终为 8 个字节。这将在磁盘上保留一点空间,因为 SQL Server 不再需要存储每一行​​的长度。

于 2013-03-15T18:52:58.967 回答