select substring(DATA, 1, datalength(DATA)) as DATA from TABLE
Это неправильное понимание типов SQL Server. Когда вы начинаете со столбца varbinary (2048), если вы не увеличите его, он останется на 2048 и не свернется, даже если вы уменьшите фактическое содержание данных.
Это показывает, что длина DATA в temptbl по-прежнему равна 2048, хотя в исходной таблице есть только одна запись, длина которой равна 64.
create table tbl(data varbinary(2048))
;
insert into tbl select convert(varbinary(2048),REPLICATE('a',64))
;
select substring(DATA, 1, datalength(Data)) as DATA
into temptbl
from tbl
;
exec sp_help temptbl
Если вы действительно хотите, вам нужно использовать динамический SQL для определения размера выходного столбца, но очень редко нужно что-либо делать.
declare @nsql nvarchar(max)
set @nsql = 'select convert(varbinary(' +
right((select max(datalength(Data)) as MaxLen from tbl),12) +
'), data) as Data from tbl'