Использование длины данных (тип данных varbinary) в подстроке - PullRequest
0 голосов
/ 01 февраля 2011

Я пытаюсь выбрать некоторые данные varbinary из TABLE (DATA varbinary (2048)) в мою .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 Ответ

1 голос
/ 01 февраля 2011
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'
...