2014-04-17 1 views
1

현재 tinyint 열의 값으로 저장된 데이터를 binary(n) 값 하나에 다른 열에 지정된 순서대로 삽입해야합니다. (. 종류는 종류의 바이트 배열을 모방의, 내 생각)T-SQL 바이너리 데이터 유형의 특정 바이트 쓰기

이 있었다 문자열이 더 큰 문자열로 결합되는 경우에, 나는 이런 식으로 뭔가를 할 거라고 :

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의 경우 작동하지 않습니다)에 올바른 방법이 아니지만 이와 비슷한 방법이 있습니까?

+0

그것은 (반드시)도 ([문자열]에 대한 신뢰성이 아니다 http://msdn.microsoft.com/en-us/library /ms189484.aspx) : "SELECT 문에서 변수를 사용하여 집계 값을 계산하지 마십시오. 예기치 않은 쿼리 결과가 발생할 수 있습니다. SELECT 목록의 모든 식 (할당 포함)이 각 출력 행에 대해 정확히 한 번만 실행되도록 보장합니다. " –

답변

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 
0

사용 FOR XML PATH는 :

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