2011-02-14 20 views
2

我有幾個表,每個表都有一個具有特定大小的二進制列(即8個字節,16個字節,32個字節等)和一個大小列,用於指示實際數據大小該二進制列,我想將所有行移動到varbinary(MAX)表中。使用SQL查詢裁剪二進制列

例如:
binary data example

我正在尋找一個SQL查詢,將用VARBINARY(MAX)列的表中的內容轉移到新表,但它必須將數據裁剪到指定的尺寸。 例如,類似這樣的東西可能:
INSERT INTO newVarBinaryTable (new_id, new_data) select (id, newData = crop(data, size)) FROM oldBinaryTable

注:我的DB是SQL Server 2008中

回答

1
INSERT INTO newVarBinaryTable 
    (new_id, new_data) 
    select id, cast(left(data, size) as varbinary(max)) 
     FROM oldBinaryTable 
1

Substring作品二進制列上。在你的情況,你需要表達

SUBSTRING(data, 1, size) 
1

注意一個8字節的二進制(8)列將0x1122334455667788,而不是爲0x12345678。每個字節都有2個十六進制字符。

你可以使用子,如果你已經有一列 「大小」

declare @t table (id int identity, bin binary(8), size int) 
insert @t select 0x0102030405060708, 8 
insert @t select 0x0102030405000000, 5 
insert @t select 0x0102030405060000, 6 
insert @t select 0x0102030405060700, 7 
insert @t select 0x0102030405060708, 8 

select id, CONVERT(varbinary(max), substring(bin, 1, size)) as newbin 
from @t 
order by id 

輸出

id   newbin 
----------- --------------------- 
1   0x0102030405060708 
2   0x0102030405 
3   0x010203040506 
4   0x01020304050607 
5   0x0102030405060708 

爲您的數據

INSERT INTO newVarBinaryTable (new_id, new_data) 
select id, substring(data, 1, size) 
FROM oldBinaryTable