请观察:
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?
答案 0 :(得分:3)
文字5
的类型为INT
,为4个字节。文字0x80
(注意0x
!)类型为BINARY(1)
,为1个字节。如果你写了
DECLARE @b VARBINARY(MAX) = 0x5;
你会达到预期的效果。