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になったのはなぜですか?
私の良さはとてもシンプルですか?それはすべてそれを説明します。 – mark