如何从LEN = 1的字节值构造VARBINARY(MAX)?

时间:2016-04-19 17:36:20

标签: sql-server

请观察:

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

产量

Value       Length
0x00000005  4

我需要的是一个VARBINARY(MAX)实例,它等于5,但长度为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开始。

编辑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?

1 个答案:

答案 0 :(得分:3)

文字5的类型为INT,为4个字节。文字0x80(注意0x!)类型为BINARY(1),为1个字节。如果你写了

DECLARE @b VARBINARY(MAX) = 0x5;

你会达到预期的效果。