在T-SQL二进制数据类型中编写特定字节

时间:2014-04-17 09:40:35

标签: sql-server tsql

我需要将当前保存为列的tinyint值的数据按照不同列的顺序插入到单个binary(n)值中。 (我猜想有点模仿一个字节数组。)

如果这是将字符串连接成一个更大的字符串,我会这样做:

declare @string table (str varchar(100), ord int)
insert into @string
select 'A', 1
union all
select 'B', 3
union all
select 'C', 2

declare @strings varchar(1000)
set @strings = ''
select @strings = @strings + str
from @string
order by ord

select @string --would return ACB

这显然不是binary数据类型的正确方法(没有空变量选项可用,加法不能以binary的方式工作),但有没有类似的方式这样做?

2 个答案:

答案 0 :(得分:2)

只要我的假设是正确的

,这应该有效
  • 您希望每个tinyint在最终结果中都是一个字节。
  • 我们没有处理太多数据 - 中间结果可能占用相当多的空间
  • 每个ord值都存在于1 - 某个最大值,没有间隙。

下面:

declare @t table (s tinyint not null,ord int not null)
insert into @t(s,ord) values (12,1),(1,2),(255,3)

;With Cat as (
    select CONVERT(varbinary(max),s) as run,ord
    from @t where ord = 1
    union all
    select run + CONVERT(varbinary(1),s),t.ord
    from Cat c inner join @t t on c.ord = t.ord - 1
)
select run from Cat where ord = (select MAX(ord) from @t)
option (maxrecursion 0)

结果:

0x0C01FF

答案 1 :(得分:0)

使用FOR XML PATH

select c, convert(varbinary, c)
from (
    select str as [text()]
    from @string
    order by ord
    for xml path('')
) x(c)