我试图从TABLE(DATA varbinary(2048))中选择一些varbinary数据到我的.NET dll而不进行任何填充。我的所有记录目前都是64字节长,但将来可能会有所不同。
我使用执行此操作的存储过程:
select substring(DATA, 1, datalength(DATA)) as DATA from TABLE
我希望这可行,但我在dll中获得的流是2050(2048 + 2)字节长。
当我对值(select substring(DATA, 1, 64) as DATA from TABLE
)进行硬编码时,它会像我期望的那样返回66个字节。
我错过了什么(明显的)?
答案 0 :(得分:1)
select substring(DATA, 1, datalength(DATA)) as DATA from TABLE
这是对SQL Server类型的误解。当您从varbinary(2048)列开始时,除非您将其设置得更长,否则它将保持在2048并且即使您减少实际数据内容也不会崩溃。
这表明temptbl中DATA的长度仍为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'