2016-04-19 8 views
0

、遵守してください:LEN = 1のバイト値からVARBINARY(MAX)を作成するにはどうすればよいですか?

DECLARE @b VARBINARY(MAX) = 5 
SELECT @b Value, LEN(@b) Length 

は私が必要なもの

Value  Length 
0x00000005 4 

を生み出すことは5に等しく、VARBINARY(MAX)インスタンスであるが、1

動機の長さがあります。

次のVARBINARY値のシーケンスを生成します。

0x00 
0x80 
0x8080 
0x808080 
0x80808080 
0x8080808080 
0x808080808080 
... 

パラメータとして与えられた任意の深さ。ここに私のコードは次のとおりです。

DECLARE @Depth INT = 50 

;WITH number AS (
    SELECT TOP (@Depth - 1) ROW_NUMBER() OVER (ORDER BY object_id) - 1 n 
    FROM sys.objects 
), mask AS (
    SELECT n, CAST(0 AS VARBINARY(MAX)) mask 
    FROM number 
    WHERE n = 0 
    UNION ALL 
    SELECT mask.n + 1 n, CAST(mask.mask + CAST(0x80 AS VARBINARY) AS VARBINARY(MAX)) mask 
    FROM number 
    JOIN mask ON number.n = mask.n 
) 
SELECT n,mask FROM mask 

そして、私はほとんど存在しています、唯一の結果は次のとおりです。

n mask 
0 0x00000000 
1 0x0000000080 
2 0x000000008080 
3 0x00000000808080 
4 0x0000000080808080 
5 0x000000008080808080 
6 0x00000000808080808080 
7 0x0000000080808080808080 
8 0x000000008080808080808080 
9 0x00000000808080808080808080 
10 0x0000000080808080808080808080 
... 

だから、私の問題は、長さである - それは、4バイトの最小値です。私はそれが私の主な問題に答えを見つけ1. ​​

EDIT 1

から起動する必要があります。

DECLARE @Depth INT = 50 

;WITH number AS (
    SELECT TOP (@Depth - 1) ROW_NUMBER() OVER (ORDER BY object_id) - 1 n 
    FROM sys.objects 
), mask AS (
    SELECT n, CAST(0x80 AS VARBINARY(MAX)) mask 
    FROM number 
    WHERE n = 1 
    UNION ALL 
    SELECT mask.n + 1 n, CAST(mask.mask + CAST(0x80 AS VARBINARY) AS VARBINARY(MAX)) mask 
    FROM number 
    JOIN mask ON number.n = mask.n 
) 
SELECT 0 n,CAST(0 AS VARBINARY(1)) mask 
UNION ALL 
SELECT n,mask FROM mask 

しかし、それは私と同じ問題を持っていない理由を私は理解していません元のソリューション。 VARBINARYの値の長さが、以前のように1ではなく4になったのはなぜですか?

答えて

3

リテラル5は、タイプがINTで、4バイトです。リテラル0x800xを覚えておいてください)はBINARY(1)の1バイトです。あなたが書いたのであれば

DECLARE @b VARBINARY(MAX) = 0x5; 

あなたが望む結果を達成したでしょう。

+0

私の良さはとてもシンプルですか?それはすべてそれを説明します。 – mark

関連する問題