0

我正在尝试从 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 个字节,如我所料。

我错过了什么(很明显)吗?

4

1 回答 1

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'
于 2011-02-01T18:24:41.850 回答