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

VARBINARYT-SQL では、バイナリ文字列データ型に似ているため、+演算子は数学的な加算を実行する代わりに 2 つの値を連結します。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)代わりに、using を検討することもできます。VARBINARY(8)SQL Server は行ごとに長さを格納する必要がなくなるため、ディスク上に小さなスペースを確保できます。

于 2013-03-15T18:52:58.967 に答える