在子字符串中使用datalength(varbinary数据类型)

时间:2011-02-01 17:37:37

标签: sql tsql sql-server-2005 datalength

我试图从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个字节。

我错过了什么(明显的)?

1 个答案:

答案 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'